Часто в Dockerfile возникает необходимость в условной логике, подобно тому, как это делается в сценариях программирования.
Однако синтаксис Dockerfile напрямую не поддерживает условия if-else.
В этой небольшой заметке рассмотрим, как можно эффективно использовать условную логику в Dockerfiles, особенно с внешними аргументами.
Прежде чем погрузиться в условную логику, давайте рассмотрим некоторые основы.
Основным способом реализации условной логики в Dockerfile является выполнение команд оболочки.
Для этого можно использовать инструкцию RUN вместе с типичными shell-командами.
Рассмотрим практический пример с использованием внешнего аргумента.
Сценарий:
Мы хотим установить либо nginx, либо apache2 на основе внешнего аргумента сборки.
Dockerfile:
# Использование базового образа Ubuntu FROM ubuntu:20.04 # Избегайте подсказок с apt ENV DEBIAN_FRONTEND=noninteractive # Объявление аргумента для веб-сервера ARG WEBSERVER # Использование логики оболочки для определения сервера для установки RUN if [ "$WEBSERVER" = "nginx" ]; then \ apt-get update && apt-get install -y nginx; \ elif [ "$WEBSERVER" = "apache" ]; then \ apt-get update && apt-get install -y apache2; \ else \ echo "No valid webserver specified"; \ fi # Остальная часть Dockerfile...
Создание образа Docker:
Для сборки образа и указания веб-сервера:
docker build --build-arg WEBSERVER=nginx -t myimage:latest .
В результате будет создан образ Docker с установленным nginx.
Для установки apache2 необходимо соответствующим образом изменить значение аргумента WEBSERVER.
Хотя файлы Dockerfiles не поддерживают встроенные структуры if-else, для реализации условной логики мы можем ловко использовать shell-сценарии в инструкции RUN.
Такой подход, при разумном использовании, может обеспечить большую гибкость при создании образов Docker, адаптированных к различным потребностям или окружению.