hub - Adición de archivos a imágenes estándar usando docker-compose
docker compose volumes (4)
No estoy seguro de si algo obvio se me escapa o si simplemente no es posible, pero estoy tratando de componer toda una pila de aplicaciones con imágenes del concentrador de docker.
Uno de ellos es mysql y admite agregar archivos de configuración personalizados a través de volúmenes y ejecutar archivos .sql desde un directorio montado.
Pero tengo estos archivos en la máquina donde ejecuto docker-compose, no en el host. ¿No hay forma de especificar los archivos de la máquina local para copiarlos en el contenedor antes de que se ejecute entrypoint / cmd? ¿Realmente tengo que crear imágenes locales de todo solo para este caso?
Así es como lo hago con volúmenes:
services:
my-db-app:
command: /shell_scripts/go.sh
volumes:
- ./shell_scripts:/shell_scripts
Como una actualización más reciente a esta pregunta: con un enjambre docker alojado en Amazon, por ejemplo, puede definir un volumen que puede ser compartido por los servicios y está disponible en todos los nodos del enjambre (utilizando el controlador cloudstor , que a su vez AWS EFS subyacente para la persistencia).
version: ''3.3''
services:
my-db-app:
command: /shell_scripts/go.sh
volumes:
shell_scripts:/shell_scripts
volumes:
shell_scripts:
driver: "cloudstor:aws"
Creo que tenías que hacer en un archivo compuesto:
volumes:
- src/file:dest/path
Opción A: incluye los archivos dentro de tu imagen. Esto no es lo ideal, ya que está mezclando archivos de configuración con su imagen (que en realidad debería contener solo sus archivos binarios, no su configuración), pero cumple con el requisito de usar solo la función docker-compose para enviar los archivos.
Esta opción se logra mediante el uso de docker-compose para compilar su imagen, y esa compilación enviará cualquier archivo desde el directorio de compilación al motor de docker remoto. Tu docker-compose.yml
se vería así:
version: ''2''
services:
my-db-app:
build: db/.
image: custom-db
Y db / Dockerfile se vería como:
FROM mysql:latest
COPY ./sql /sql
El punto de entrada / cmd permanecería sin cambios. Necesitaría ejecutar docker-compose up --build
si la imagen ya existe y necesita cambiar los archivos sql.
Opción B: Use un volumen para almacenar sus datos. Esto no se puede hacer directamente dentro de docker-compose. Sin embargo, es la forma preferida de incluir archivos desde fuera de la imagen en el contenedor. Puede llenar el volumen a través de la red utilizando la CLI de la ventana acoplable y la redirección de entrada junto con un comando como tar para empaquetar y desempaquetar los archivos que se envían a través de la entrada estándar:
tar -cC sql . | docker run --rm -it -v sql-files:/sql /
busybox /bin/sh -c "tar -xC /sql"
Ejecute eso a través de un script y luego pida a ese mismo script que rebote el contenedor de la base de datos para volver a cargar esa configuración.
Opción C: utilizar algún tipo de sistema de archivos adjuntos de red. Si puede configurar NFS en el host donde ejecuta la CLI de la ventana acoplable, puede conectarse a esos recursos compartidos de NFS desde el nodo de la ventana acoplable remota usando una de las siguientes opciones:
# create a reusable volume
$ docker volume create --driver local /
--opt type=nfs /
--opt o=addr=192.168.1.1,rw /
--opt device=:/path/to/dir /
foo
# or from the docker run command
$ docker run -it --rm /
--mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,volume-opt=o=addr=192.168.1.1,volume-opt=device=:/host/path /
foo
# or to create a service
$ docker service create /
--mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,volume-opt=o=addr=192.168.1.1,volume-opt=device=:/host/path /
foo
Opción D: con el modo de enjambre, puedes incluir archivos como configuraciones en tu imagen. Esto permite que los archivos de configuración, que normalmente deberían enviarse a cualquier nodo del enjambre, se envíen al nodo donde se está ejecutando el servicio. Esto utiliza un archivo docker-compose.yml
para definirlo, pero el modo de enjambre no utiliza el componente docker-compose, por lo que es posible que no se ajuste a sus requisitos específicos. Puede ejecutar un clúster en modo de enjambre de un solo nodo, por lo que esta opción está disponible incluso si solo tiene un solo nodo. Esta opción requiere que cada uno de sus archivos sql se agregue como una configuración separada. El docker-compose.yml
se vería así:
version: ''3.4''
configs:
sql_file_1:
file: ./file_1.sql
services
my-db-app:
image: my-db-app:latest
configs:
- source: sql_file_1
target: /sql/file_1.sql
mode: 444
Luego, en lugar de un docker-compose up
, ejecutaría un docker stack deploy -c docker-compose.yml my-db-stack
.