registrarse hub docker symlink

hub - download docker image



Docker y enlaces simbólicos (3)

Tengo un repositorio configurado de esta manera:

/config config.json /worker-a Dockerfile <symlink to config.json> /code /worker-b Dockerfile <symlink to config.json> /code

Sin embargo, la creación de las imágenes falla porque Docker no puede manejar los enlaces simbólicos. Debo mencionar que mi proyecto es mucho más complicado que esto, por lo que la reestructuración de directorios no es una gran opción. ¿Cómo trato con esta situación?


Docker no admite archivos de enlace externo fuera del contexto de compilación .

Algunos métodos diferentes para usar un archivo compartido en un contenedor.

Comparte una imagen base

Cree un Dockerfile para la Dockerfile de la base worker-config que incluye la configuración compartida / archivos.

COPY config.json /config.json

Construye y etiqueta la imagen como worker-config

docker build -t worker-config:latest .

Fuente la imagen de worker-config base de worker-config para todos los Dockerfile su trabajador

FROM worker-config:latest

Construir script

Use un script para enviar la configuración común a cada uno de sus contenedores de trabajadores.

./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 "$@" .

Construir desde URL

Extraiga la configuración de una URL común para todas worker-n compilaciones de worker-n .

ADD http://somehost/config.json /

Aumentar el alcance del contexto de construcción de la imagen.

Incluya los archivos de destino de enlaces simbólicos en el contexto de compilación construyendo desde un directorio principal que incluya tanto los archivos compartidos como los archivos contenedores específicos.

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

Todas las rutas de origen a las que hace referencia en un Dockerfile también deben cambiar para coincidir con el nuevo contexto de construcción:

COPY workerathing /app

se convierte en

COPY worker-a/workerathing /app

El uso de este método puede hacer que todos los contextos de compilación sean grandes si tiene un contexto de compilación grande, ya que todos se comparten. Puede ralentizar las compilaciones, especialmente a los servidores de compilación remotos de Docker.

Montar un directorio de configuración de un volumen con nombre

Los volúmenes como este solo funcionan como directorios, por lo que no puede especificar un archivo como podría cuando se monta un archivo del host al contenedor.

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

Montar el directorio de configuración desde el contenedor de datos

De nuevo, los directorios solo son básicamente los mismos que los anteriores. Sin embargo, esto copiará automáticamente los archivos del directorio de destino en el volumen compartido recién creado.

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

Montar el archivo de configuración desde el host

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


El comando CLI de docker build envía el directorio especificado (normalmente) como el "contexto de compilación" al Docker Engine (daemon). En lugar de especificar el contexto de compilación como /worker-a , especifique el contexto de compilación como el directorio raíz y use el argumento -f para especificar la ruta al Dockerfile en uno de los directorios secundarios.

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

Tendrá que volver a trabajar sus Dockerfiles ligeramente, para que apunten a ../config/config.json , pero eso es bastante trivial de arreglar.

También revisa esta pregunta / respuesta, que creo que aborda exactamente el mismo problema que estás experimentando.

¿Cómo incluir archivos fuera del contexto de compilación de Docker?

¡Espero que esto ayude! Aclamaciones


Una solución alternativa es actualizar todos sus enlaces flexibles en enlaces duros.