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.