Сборка сервисов с аргументами сборки и без кеша
На этом шаге мы рассмотрим две продвинутые опции сборки в 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.