Docker: декілька Dockerfiles у проекті


215

Як ви впорядковуєте Dockerfiles, що належить проекту, коли у вас є один Dockerfile для бази даних, один для сервера додатків тощо? Ви створюєте якусь ієрахію у джерелі? Великий корпоративний проект не може складатися лише з одного Dockerfile?


15
ви можете змінити прийняту відповідь
помбер

3
Повинна бути можливість "перехитрити" і автоматично перемістити застарілий атрибут "Прийнято" на більш відповідну відповідь. Критерієм придатності для такого кроку може бути 1) велика різниця в голосах скажімо, 10: 1 І 2) автор запитання не ввійшов, скажімо, рік і довше (здається, @LuckyLuke вийшов у відставку з 4 років тому ...)
mirekphd

Відповіді:


6

Примітка автора

Ця відповідь застаріла. Фіг вже не існує і був замінений композитором Докера . Прийняті відповіді не можна видалити ....

Docker Compose підтримує побудову ієрархії проектів. Тому зараз легко підтримувати Dockerfile у кожному підкаталозі.

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

Оригінальна відповідь

Я просто створюю каталог, що містить Dockerfile для кожного компонента. Приклад:

Під час створення контейнерів просто введіть ім'я каталогів і Docker вибере правильний Dockerfile.


3
@DuncanJones Тому що ви не можете видалити прийняту відповідь ... Пробував :-)
Марк О'Коннор

286

У нових версіях (> = 1.8.0) докера ви можете це зробити

docker build -f Dockerfile.db .
docker build -f Dockerfile.web .

Велика економія.

EDIT: оновлення версій за коментарем raksja

EDIT: коментар від @vsevolod: можна виділити синтаксис у коді VS, надавши файли .Dockerfile розширення (замість імені), наприклад, Prod.Dockerfile, Test.Dockerfile тощо.


2
яка новіша версія?
raksja

4
Щойно перевірено, github.com/docker/docker/wiki , тому його> Docker 1.8.0
raksja

3
переконайтеся, що це працює, але мій IDE не буде робити жодного підкреслення синтаксису, оскільки він не розпізнає ім'я файлу :(
Alexander Mills

3
@AlexanderMills мій IDE WebStorm не дозволяє навіть Dockerfile.webконфігурацію запуску. Тож я створив випуск: youtrack.jetbrains.com/issue/WEB-28185
парі

5
Як ви визначаєте, який Dockerfile слід використовувати для кожної "послуги", визначеної у docker-compose.ymlфайлі, наприклад?
JoeTidee

127

Використання docker-composeта множинність Dockerfileв окремих каталогах

Не перейменовуйте свійDockerfile на Dockerfile.dbабо Dockerfile.web, він може не підтримуватися вашим IDE, і ви втратите підсвічування синтаксису.

Як сказав Кінгслі Учнор , у вас може бути кілька Dockerfile, по одному на каталог, які представляють щось, що ви хочете створити.

Мені подобається мати dockerпапку, яка містить всі програми та їх конфігурацію. Ось приклад ієрархії папок проекту для веб-програми, яка має базу даних.

docker-compose.yml
docker
├── web
│   └── Dockerfile
└── db
    └── Dockerfile

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"

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

Якщо вам потрібні файли з попередніх папок під час створення вашого Dockerfile

Ви все ще можете скористатись вищезазначеним рішенням та розмістити свій Dockerfileкаталог у такому каталозі, як docker/web/Dockerfileвсе, що вам потрібно, - це встановити збірку contextу вашому docker-compose.ymlподібному:

version: '3'
services:
  web:
    build:
      context: .
      dockerfile: ./docker/web/Dockerfile
    ports:
     - "5000:5000"
    volumes:
     - .:/code

Таким чином, ви зможете мати такі речі:

config-on-root.ini
docker-compose.yml
docker
└── web
    ├── Dockerfile
    └── some-other-config.ini

і ./docker/web/Dockerfileподібне:

FROM alpine:latest

COPY config-on-root.ini /
COPY docker/web/some-other-config.ini /

Ось кілька швидких команд від tldr docker-compose . Обов’язково зверніться до офіційної документації для отримання детальної інформації.


1
Що робити, якщо вам потрібно скопіювати файл менеджера пакунків, щоб встановити деп у час складання (fi COPY ../package.json /app/package.json)? Цей файл, як правило, знаходиться на рівні коренів, і докер забороняє доступ до батьків. Якого підходу ви будете дотримуватися?
nass600

1
Я вдарив , що обмеження теж і за винятком цього, я будую webпроект з .docker-compose.yml: build: .). Таким чином, webмає доступ до кореневих файлів під час створення. Я бачив це пов'язане питання: stackoverflow.com/questions/24537340/…, і ми можемо створити з батьківського каталогу замість цього, коли використовуємо dockerкомандний рядок, і ця відповідь показує, як це зробити з docker-compose: stackoverflow.com/a/45353241/ 1092815
GabLeRoux

1
Це проблема з вашим IDE, а не з докером. @Shuo має правильну відповідь.
BentOnCoding

1
Друга відповідь - 1 рік, але вона безпосередньо не взята з документації Докера. -fваріант хороший, але я вважаю за краще використовувати docker-composeз вкладеними папками. Я думаю, обидві відповіді справедливі. Більшість людей можуть просто віддати перевагу збереженню за замовчуванням Dockerfileімені, щоб підтримувати більшість IDE поза коробкою. Я не визнаю першою відповідь, я просто пропоную альтернативу. Мені просто не подобається, що мій IDE вважає, що мій Dockerfile - це phpфайл, коли я його використовую Dockerfile.php, але так, він працює. Я бачив кілька прикладів у документації докера; Dockerfile.build, Dockerfile.debugтощо.
GabLeRoux

3
Ім'я як example.Dockerfileзберігає підсвічування синтаксису та піктограми на VSCode.
vmassuchetto

8

У Intellij я просто змінив назву докерних файлів на * .Dockerfile і пов’язав тип файлу * .Dockerfile з синтаксисом docker.


1
Спробував це, і я отримав хороший значок Докера.
Драмбег

3

Додайте шар абстракції, наприклад, файл YAML, як у цьому проекті https://github.com/larytet/dockerfile-generator, який виглядає як

centos7:
    base: centos:centos7
    packager: rpm
    install:
      - $build_essential_centos 
      - rpm-build
    run:
      - $get_release
    env:
      - $environment_vars

Короткий сценарій / створення Python може генерувати всі Dockerfiles з конфігураційного файла.


1

Працюючи над проектом, який вимагає використання декількох докер-файлів, просто створіть кожен dockerfile в окремому каталозі. Наприклад,

додаток / db /

Кожен із вищезазначених каталогів міститиме свій докерфайл. Коли програма розробляється, докер здійснюватиме пошук у всіх каталогах та збиратиме всі докерфіли.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.