Сборка сервисов с аргументами сборки и без кэша
На этом шаге мы рассмотрим две продвинутые опции сборки в Docker Compose: использование аргументов сборки и сборку без кэша.
Аргументы сборки позволяют передавать переменные в процесс сборки Docker. Это полезно для кастомизации сборки под разные окружения или конфигурации без изменения самого Dockerfile
.
Сначала модифицируем наш Dockerfile
для приёма аргумента сборки. Откроем Dockerfile
для редактирования:
nano ~/project/Dockerfile
Изменим содержимое на следующее:
FROM ubuntu:latest
ARG MESSAGE="Hello from build argument!"
RUN apt-get update && apt-get install -y cowsay
CMD ["cowsay", "$MESSAGE"]
Мы добавили инструкцию ARG MESSAGE
для определения аргумента сборки с именем MESSAGE
и значением по умолчанию. Также изменили инструкцию CMD
для использования этого аргумента.
Сохраните Dockerfile
, нажав Ctrl + X
, затем Y
и Enter
.
Теперь модифицируем файл docker-compose.yml
для передачи значения этому аргументу сборки. Откроем файл для редактирования:
nano ~/project/docker-compose.yml
Изменим содержимое на следующее:
version: "3.8"
services:
cow:
build:
context: .
args:
MESSAGE: "Custom message from Compose!"
Мы изменили директиву build:
на объект с полями context:
и args:
.
context: .
указывает контекст сборки - директорию, содержащую Dockerfile
args:
содержит аргументы сборки для передачи в Dockerfile
. Мы передаём значение "Custom message from Compose!"
аргументу MESSAGE
Сохраните файл docker-compose.yml
, нажав Ctrl + X
, затем Y
и Enter
.
Теперь соберём образ с аргументом сборки. Убедитесь, что вы находитесь в директории ~/project
.
cd ~/project
docker-compose build
Наблюдайте за выводом сборки. Вы должны увидеть, что аргумент сборки используется в процессе.
После завершения сборки запустим контейнер из этого образа, чтобы увидеть вывод.
docker run project_cow
Вы должны увидеть вывод cowsay
с сообщением "Custom message from Compose!". Это подтверждает успешную передачу и использование аргумента сборки.
Иногда может потребоваться принудительная пересборка всех слоёв без использования кэша. Это полезно при подозрении на проблемы с кэшем или для гарантии чистой сборки. Для этого используется флаг --no-cache
с командой docker-compose build
.
Попробуем пересобрать образ с флагом --no-cache
.
docker-compose build --no-cache
Снова наблюдайте за выводом сборки. На этот раз Docker не будет использовать кэшированные слои и пересоберёт каждый шаг в Dockerfile
. Этот процесс займёт больше времени, чем сборка с кэшем.
После завершения сборки можно снова запустить контейнер для подтверждения, что сообщение осталось переданным через аргумент сборки.
docker run project_cow
Вы по-прежнему должны увидеть "Custom message from Compose!". Флаг --no-cache
влияет только на процесс сборки, а не на конфигурацию, определённую в docker-compose.yml
.