Docker: несколько Docker-файлов в проекте


218

Как вы организуете файлы Docker, принадлежащие проекту, когда у вас есть один файл Docker для базы данных, один для сервера приложений и т. Д.? Вы создаете какую-то иерархию в источнике? Крупный корпоративный проект не может состоять только из одного Dockerfile?


16
Вы можете изменить принятый ответ
pomber

3
Должна быть опция «outvote» и автоматического перемещения устаревшего атрибута «Accepted» в более подходящий ответ. Критерием приемлемости для такого шага может быть 1) большая разница в голосах, скажем, 10: 1 И 2) автор вопроса не вошел, скажем, год или дольше (кажется, @LuckyLuke ушел из SO 4 года назад ...)
mirekphd

Ответы:


6

Примечание автора

Этот ответ устарел. Инжир больше не существует и был заменен Docker compose . Принятые ответы не могут быть удалены ....

Docker Compose поддерживает построение проекта иерархии. Так что теперь легко поддерживать Dockerfile в каждом подкаталоге.

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

Оригинальный ответ

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

При сборке контейнеров просто укажите имя каталога, и Docker выберет правильный файл Dockerfile.


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

287

В более новых версиях (> = 1.8.0) Docker вы можете сделать это

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

Большое спасение.

РЕДАКТИРОВАТЬ: обновить версии в соответствии с комментарием Ракся

РЕДАКТИРОВАТЬ: комментарий от @vsevolod: можно получить подсветку синтаксиса в коде VS, задав файлы. Расширение Dockerfile (вместо имени), например, Prod.Dockerfile, Test.Dockerfile и т. Д.


2
какая новая версия?
Ракша

4
Только что проверил, github.com/docker/docker/wiki , так что его> Docker 1.8.0
raksja

3
конечно, это работает, но моя среда IDE не будет выполнять подсветку синтаксиса, потому что не распознает имя файла :(
Александр Миллс,

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

5
Как указать, какой Dockerfile следует использовать, например, для каждой «службы», определенной в docker-compose.ymlфайле?
JoeTidee

130

Используйте 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
Что если вам нужно скопировать файл менеджера пакетов, чтобы установить deps во время сборки (fi COPY ../package.json /app/package.json)? Этот файл обычно находится на корневом уровне, и Docker запретил доступ к родительскому. Какой подход вы будете использовать?
nass600

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

1
Это проблема с вашей IDE, а не с докером. @ Шуо имеет правильный ответ.
BentOnCoding

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

3
Наименование as example.Dockerfileсохраняет подсветку синтаксиса и иконки на VSCode.
vmassuchetto

8

В Intellij я просто изменил имя файла Docker на * .Dockerfile и связал тип файла * .Dockerfile с синтаксисом Docker.


1
Попробовал это, и я получил хорошую иконку Docker.
Драмбег

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 / make может генерировать все файлы Docker из файла конфигурации.


1

При работе над проектом, который требует использования нескольких файлов Docker, просто создайте каждый файл Docker в отдельном каталоге. Например,

app / db /

Каждый из вышеперечисленных каталогов будет содержать свой dockerfile. Когда приложение собирается, docker будет искать все каталоги и создавать все файлы Docker.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.