Docker and symlinks

前端 未结 4 1190
别那么骄傲
别那么骄傲 2020-12-23 16:28

I\'ve got a repo set up like this:

/config
   config.json
/worker-a
   Dockerfile
   
   /code
/worker-b
   Dockerfile
   

        
4条回答
  •  一整个雨季
    2020-12-23 16:58

    Docker doesn't support symlinking files outside the build context.

    Here are some different methods for using a shared file in a container:

    Share a base image

    Create a Dockerfile for the base worker-config image that includes the shared config/files.

    COPY config.json /config.json
    

    Build and tag the image as worker-config

    docker build -t worker-config:latest .
    

    Source the base worker-config image for all your worker Dockerfiles

    FROM worker-config:latest
    

    Build script

    Use a script to push the common config to each of your worker containers.

    ./build worker-n

    #!/bin/sh
    set -uex 
    rundir=$(readlink -f "${0%/*}")
    container=$(shift)
    cd "$rundir/$container"
    cp ../config/config.json ./config-docker.json
    docker build "$@" .
    

    Build from URL

    Pull the config from a common URL for all worker-n builds.

    ADD http://somehost/config.json /
    

    Increase the scope of the image build context

    Include the symlink target files in the build context by building from a parent directory that includes both the shared files and specific container files.

    cd ..
    docker build -f worker-a/Dockerfile .
    

    All the source paths you reference in a Dockerfile must also change to match the new build context:

    COPY workerathing /app
    

    becomes

    COPY worker-a/workerathing /app
    

    Using this method can make all build contexts large if you have one large build context, as they all become shared. It can slow down builds, especially to remote Docker build servers.

    Mount a config directory from a named volume

    Volumes like this only work as directories, so you can't specify a file like you could when mounting a file from the host to container.

    docker volume create --name=worker-cfg-vol
    docker run -v worker-cfg-vol:/config worker-config cp config.json /config
    
    docker run -v worker-cfg-vol:/config:/config worker-a
    

    Mount config directory from data container

    Again, directories only as it's basically the same as above. This will automatically copy files from the destination directory into the newly created shared volume though.

    docker create --name wcc -v /config worker-config /bin/true
    docker run --volumes-from wcc worker-a
    

    Mount config file from host

    docker run -v /app/config/config.json:/config.json worker-a
    

提交回复
热议问题