tutorial - Múltiples Dockerfiles en proyecto
tutorial docker file (6)
¿Cómo organiza los Dockerfiles que pertenecen a un proyecto cuando tiene un Dockerfile para la base de datos, uno para el servidor de aplicaciones, etc.? ¿Creas algún tipo de jerarquía en la fuente? ¿Un gran proyecto empresarial no puede consistir en un solo Dockerfile?
Nota del autor
Esta respuesta está desactualizada. Fig ya no existe y ha sido reemplazado por Docker compose .
Respuesta original
Acabo de crear un directorio que contiene un Dockerfile para cada componente. Ejemplo:
Cuando construya los contenedores, simplemente proporcione el nombre del directorio y Docker seleccionará el Dockerfile correcto.
Use
docker-compose
y múltiples
Dockerfile
en directorios separados
No cambie el nombre de su
Dockerfile
aDockerfile.db
oDockerfile.web
, es posible que su IDE no lo admita y perderá el resaltado de sintaxis.
Como
dijo Kingsley Uchnor
, puede tener múltiples
Dockerfile
, uno por directorio, que representan algo que desea construir.
Me gusta tener una carpeta
docker
que contenga cada aplicación y su configuración.
Aquí hay una jerarquía de carpetas de proyecto de ejemplo para una aplicación web que tiene una base de datos.
docker-compose.yml
docker
├── web
│ └── Dockerfile
└── db
└── Dockerfile
Ejemplo de
docker-compose.yml
:
version: ''3''
services:
web:
# will build ./docker/web/Dockerfile
build: ./docker/web
ports:
- "5000:5000"
volumes:
- .:/code
db:
# will build ./docker/db/Dockerfile
build: ./docker/db
ports:
- "3306:3306"
redis:
# will use docker hub''s redis prebuilt image from here:
# https://hub.docker.com/_/redis/
image: "redis:alpine"
ejemplo de uso de línea de comando
docker-compose
:
# The following command will create and start all containers in the background
# using docker-compose.yml from current directory
docker-compose up -d
# get help
docker-compose --help
En caso de que necesite archivos de carpetas anteriores al construir su Dockerfile
Todavía puede usar la solución anterior y colocar su
Dockerfile
en un directorio como
docker/web/Dockerfile
, todo lo que necesita es establecer el
context
compilación en su
docker-compose.yml
esta manera:
version: ''3''
services:
web:
build:
context: .
dockerfile: ./docker/web/Dockerfile
ports:
- "5000:5000"
volumes:
- .:/code
De esta manera, podrás tener cosas como esta:
config-on-root.ini
docker-compose.yml
docker
└── web
├── Dockerfile
└── some-other-config.ini
y un
./docker/web/Dockerfile
como este:
FROM alpine:latest
COPY config-on-root.ini /
COPY docker/web/some-other-config.ini /
Aquí hay algunos comandos rápidos de tldr docker-compose . Asegúrese de consultar la documentación oficial para más detalles.
Agregue una capa de abstracción, por ejemplo, un archivo YAML como en este proyecto https://github.com/larytet/dockerfile-generator que se ve como
centos7:
base: centos:centos7
packager: rpm
install:
- $build_essential_centos
- rpm-build
run:
- $get_release
env:
- $environment_vars
Un breve script / make de Python puede generar todos los Dockerfiles del archivo de configuración.
Cuando trabaje en un proyecto que requiera el uso de múltiples dockerfiles, simplemente cree cada dockerfile en un directorio separado. Por ejemplo,
app / db /
Cada uno de los directorios anteriores contendrá su dockerfile. Cuando se crea una aplicación, Docker buscará en todos los directorios y compilará todos los dockerfiles.
En versiones más recientes (> = 1.8.0) de docker , puede hacer esto
docker build -f Dockerfile.db .
docker build -f Dockerfile.web .
Un gran ahorro.
EDITAR: actualizar versiones por comentario de raksja
En Intellij, simplemente cambié el nombre de los archivos docker a * .Dockerfile y asocié el tipo de archivo * .Dockerfile a la sintaxis de docker.