Содержание

Использование if-else в Dockerfile

Часто в Dockerfile возникает необходимость в условной логике, подобно тому, как это делается в сценариях программирования.

Однако синтаксис Dockerfile напрямую не поддерживает условия if-else.

В этой небольшой заметке рассмотрим, как можно эффективно использовать условную логику в Dockerfiles, особенно с внешними аргументами.

1. Основы: ARG и ENV

Прежде чем погрузиться в условную логику, давайте рассмотрим некоторые основы.

2. Использование команд оболочки для условной логики

Основным способом реализации условной логики в 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.

3. Ограничения и соображения

Заключение

Хотя файлы Dockerfiles не поддерживают встроенные структуры if-else, для реализации условной логики мы можем ловко использовать shell-сценарии в инструкции RUN.

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