Як ви впорядковуєте Dockerfiles, що належить проекту, коли у вас є один Dockerfile для бази даних, один для сервера додатків тощо? Ви створюєте якусь ієрахію у джерелі? Великий корпоративний проект не може складатися лише з одного Dockerfile?
Як ви впорядковуєте Dockerfiles, що належить проекту, коли у вас є один Dockerfile для бази даних, один для сервера додатків тощо? Ви створюєте якусь ієрахію у джерелі? Великий корпоративний проект не може складатися лише з одного Dockerfile?
Відповіді:
Ця відповідь застаріла. Фіг вже не існує і був замінений композитором Докера . Прийняті відповіді не можна видалити ....
Docker Compose підтримує побудову ієрархії проектів. Тому зараз легко підтримувати Dockerfile у кожному підкаталозі.
├── docker-compose.yml
├── project1
│ └── Dockerfile
└── project2
└── Dockerfile
Я просто створюю каталог, що містить Dockerfile для кожного компонента. Приклад:
Під час створення контейнерів просто введіть ім'я каталогів і Docker вибере правильний Dockerfile.
У нових версіях (> = 1.8.0) докера ви можете це зробити
docker build -f Dockerfile.db .
docker build -f Dockerfile.web .
Велика економія.
EDIT: оновлення версій за коментарем raksja
EDIT: коментар від @vsevolod: можна виділити синтаксис у коді VS, надавши файли .Dockerfile розширення (замість імені), наприклад, Prod.Dockerfile, Test.Dockerfile тощо.
Dockerfile.webконфігурацію запуску. Тож я створив випуск: youtrack.jetbrains.com/issue/WEB-28185
docker-compose.ymlфайлі, наприклад?
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каталог у такому каталозі, як 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 . Обов’язково зверніться до офіційної документації для отримання детальної інформації.
COPY ../package.json /app/package.json)? Цей файл, як правило, знаходиться на рівні коренів, і докер забороняє доступ до батьків. Якого підходу ви будете дотримуватися?
webпроект з . (в docker-compose.yml: build: .). Таким чином, webмає доступ до кореневих файлів під час створення. Я бачив це пов'язане питання: stackoverflow.com/questions/24537340/…, і ми можемо створити з батьківського каталогу замість цього, коли використовуємо dockerкомандний рядок, і ця відповідь показує, як це зробити з docker-compose: stackoverflow.com/a/45353241/ 1092815
-fваріант хороший, але я вважаю за краще використовувати docker-composeз вкладеними папками. Я думаю, обидві відповіді справедливі. Більшість людей можуть просто віддати перевагу збереженню за замовчуванням Dockerfileімені, щоб підтримувати більшість IDE поза коробкою. Я не визнаю першою відповідь, я просто пропоную альтернативу. Мені просто не подобається, що мій IDE вважає, що мій Dockerfile - це phpфайл, коли я його використовую Dockerfile.php, але так, він працює. Я бачив кілька прикладів у документації докера; Dockerfile.build, Dockerfile.debugтощо.
example.Dockerfileзберігає підсвічування синтаксису та піктограми на VSCode.
У Intellij я просто змінив назву докерних файлів на * .Dockerfile і пов’язав тип файлу * .Dockerfile з синтаксисом docker.
Додайте шар абстракції, наприклад, файл 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 з конфігураційного файла.
Працюючи над проектом, який вимагає використання декількох докер-файлів, просто створіть кожен dockerfile в окремому каталозі. Наприклад,
додаток / db /
Кожен із вищезазначених каталогів міститиме свій докерфайл. Коли програма розробляється, докер здійснюватиме пошук у всіх каталогах та збиратиме всі докерфіли.