Docker: Múltiples Dockerfiles en proyecto

214

¿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?

LuckyLuke
fuente
15
es posible que desee cambiar la respuesta aceptada
pomber
3
Debería haber una opción para "votar" y mover automáticamente un atributo "aceptado" obsoleto a una respuesta más apropiada. El criterio de elegibilidad para tal movimiento podría ser 1) una gran diferencia en los votos de digamos, 10: 1 Y 2) el autor de la pregunta no se ha conectado durante, por ejemplo, un año o más (parece que @LuckyLuke se retiró de SO 4 años Hace ...)
mirekphd

Respuestas:

6

Nota del autor

Esta respuesta está desactualizada. Fig ya no existe y ha sido reemplazado por Docker compose . Las respuestas aceptadas no se pueden eliminar ...

Docker Compose apoya la construcción de la jerarquía de proyectos. Por lo tanto, ahora es fácil admitir un Dockerfile en cada subdirectorio.

├── docker-compose.yml
├── project1
│   └── Dockerfile
└── project2
    └── Dockerfile

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.

Mark O'Connor
fuente
3
@DuncanJones Porque no puedes eliminar una respuesta aceptada ... Probado :-)
Mark O'Connor
285

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

EDITAR: comentario de @vsevolod: es posible obtener resaltado de sintaxis en el código VS dando archivos. Extensión de Dockerfile (en lugar de nombre), por ejemplo, Prod.Dockerfile, Test.Dockerfile, etc.

Shuo
fuente
2
¿Qué versión más nueva?
raksja
44
Acabo de comprobar, github.com/docker/docker/wiki , por lo que es> Docker 1.8.0
raksja
3
seguro que esto funciona, pero mi IDE no resaltará la sintaxis, porque no reconoce el nombre del archivo :(
Alexander Mills
3
@AlexanderMills mi IDE WebStorm ni siquiera permite Dockerfile.webcomo configuración de ejecución. Así que creé un problema: youtrack.jetbrains.com/issue/WEB-28185
alimentado a vapor el
55
¿Cómo especifica qué Dockerfile debe usarse para cada 'servicio' definido dentro de un docker-compose.ymlarchivo, por ejemplo?
JoeTidee
127

Uso docker-composey múltiples Dockerfileen directorios separados

No cambiar el nombreDockerfile de Dockerfile.dbo Dockerfile.web, puede no ser compatible con su IDE y se 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 dockercarpeta 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

docker-compose.yml ejemplo:

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"

docker-compose ejemplo de uso de línea de comando:

# 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 colocarla Dockerfileen un directorio como docker/web/Dockerfile, todo lo que necesita es configurar la compilación contextde docker-compose.ymlesta 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 una ./docker/web/Dockerfilecomo esta:

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.

GabLeRoux
fuente
1
¿Qué sucede si necesita copiar un archivo de administrador de paquetes para instalar los departamentos en tiempo de compilación (fi COPY ../package.json /app/package.json)? Ese archivo generalmente estará en el nivel raíz y la ventana acoplable ha prohibido el acceso al padre. ¿Qué enfoque seguirás?
nass600
1
También he alcanzado esa limitación y para esta excepción, construyo el webproyecto desde . (en docker-compose.yml:) build: .. De esta manera, webtiene acceso a los archivos raíz al compilar. He visto esta pregunta relacionada: stackoverflow.com/questions/24537340/… y podemos construir desde el directorio principal en su lugar cuando usamos la dockerlínea de comandos y esta respuesta muestra cómo hacerlo con docker-compose: stackoverflow.com/a/45353241/ 1092815
GabLeRoux
1
Este es un problema con su IDE, no con Docker. @Shuo tiene la respuesta correcta.
BentOnCoding
1
La segunda respuesta tiene 1 año pero no se toma directamente de la documentación de Docker. -fLa opción está bien, pero prefiero usarla docker-composecon subcarpetas. Creo que ambas respuestas son válidas. Es posible que la mayoría de las personas prefieran mantener el Dockerfilenombre predeterminado para admitir la mayoría de los IDE listos para usar. No estoy invalidando la primera respuesta, solo estoy brindando una alternativa. Simplemente no me gusta que mi IDE piense que mi Dockerfile es un phparchivo cuando lo uso Dockerfile.php, pero sí, funciona. He visto algunos ejemplos en la documentación de la ventana acoplable; Dockerfile.build, Dockerfile.debugetc.
GabLeRoux
3
Nombrar como example.Dockerfilemantiene resaltado de sintaxis e íconos en VSCode.
vmassuchetto
8

En Intellij, simplemente cambié el nombre de los archivos Docker a * .Dockerfile, y asocié el tipo de archivo * .Dockerfile a la sintaxis de Docker.

KaziMurtaza
fuente
1
Intenté esto y obtengo un bonito ícono de Docker.
Drumbeg
3

Agregue una capa de abstracción, por ejemplo, un archivo YAML como en este proyecto https://github.com/larytet/dockerfile-generator que se parece a

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 desde el archivo de configuración.

Larytet
fuente
1

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á todos los directorios y compilará todos los dockerfiles.

Kingsley Uchnor
fuente