Подтвердить что ты не робот

ARG или ENV, какой из них использовать в этом случае?

Возможно, это может быть тривиальный вопрос, но чтение документов для ARG и ENV не дает мне понять.

Я создаю контейнер PHP-FPM, и я хочу дать возможность включить/отключить некоторые расширения по потребностям пользователей.

Было бы здорово, если бы это можно было сделать в файле Docker, добавив условные обозначения и пропустив флаги команды сборки, но AFAIK не поддерживается.

В моем случае и мой личный подход заключается в том, чтобы запускать небольшой скрипт при запуске контейнера, что-то вроде следующего:

#!/bin/sh   
set -e

RESTART="false"

# This script will be placed in /config/init/ and run when container starts.
if  [ "$INSTALL_XDEBUG" == "true" ]; then
    printf "\nInstalling Xdebug ...\n"
    yum install -y  php71-php-pecl-xdebug
    RESTART="true"
fi
...   
if  [ "$RESTART" == "true" ]; then
    printf "\nRestarting php-fpm ...\n"
    supervisorctl restart php-fpm
fi

exec "[email protected]"

Вот как выглядит мой Dockerfile:

FROM reynierpm/centos7-supervisor
ENV TERM=xterm \
    PATH="/root/.composer/vendor/bin:${PATH}" \
    INSTALL_COMPOSER="false" \
    COMPOSER_ALLOW_SUPERUSER=1 \
    COMPOSER_ALLOW_XDEBUG=1 \
    COMPOSER_DISABLE_XDEBUG_WARN=1 \
    COMPOSER_HOME="/root/.composer" \
    COMPOSER_CACHE_DIR="/root/.composer/cache" \
    SYMFONY_INSTALLER="false" \
    SYMFONY_PROJECT="false" \
    INSTALL_XDEBUG="false" \
    INSTALL_MONGO="false" \
    INSTALL_REDIS="false" \
    INSTALL_HTTP_REQUEST="false" \
    INSTALL_UPLOAD_PROGRESS="false" \
    INSTALL_XATTR="false"

RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm \
                   https://rpms.remirepo.net/enterprise/remi-release-7.rpm
RUN yum install -y  \
        yum-utils \
        git \
        zip \
        unzip \
        nano \
        wget \
        php71-php-fpm \
        php71-php-cli \
        php71-php-common \
        php71-php-gd \
        php71-php-intl \
        php71-php-json \
        php71-php-mbstring \
        php71-php-mcrypt \
        php71-php-mysqlnd \
        php71-php-pdo \
        php71-php-pear \
        php71-php-xml \
        php71-pecl-apcu \
        php71-php-pecl-apfd \
        php71-php-pecl-memcache \
        php71-php-pecl-memcached \
        php71-php-pecl-zip && \
        yum clean all && rm -rf /tmp/yum*

RUN ln -sfF /opt/remi/php71/enable /etc/profile.d/php71-paths.sh && \
    ln -sfF /opt/remi/php71/root/usr/bin/{pear,pecl,phar,php,php-cgi,phpize} /usr/local/bin/. && \
    mv -f /etc/opt/remi/php71/php.ini /etc/php.ini && \
    ln -s /etc/php.ini /etc/opt/remi/php71/php.ini && \
    rm -rf /etc/php.d && \
    mv /etc/opt/remi/php71/php.d /etc/. && \
    ln -s /etc/php.d /etc/opt/remi/php71/php.d

COPY container-files /
RUN chmod +x /config/bootstrap.sh
WORKDIR /data/www
EXPOSE 9001

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

В настоящее время это работает, но... Если я хочу добавить let say 20 (случайное число) расширений или любую другую функцию, которая может быть включена | отключить, тогда я закончу 20 ненужных ENV (потому что Dockerfile не поддерживает. env files), единственной целью которого был бы установить этот флаг, чтобы скрипт знал, что делать тогда...

  • Правильно ли это?
  • Должен ли я использовать ENV для этой цели?

Я открыт для идей, если у вас есть другой подход для достижения этого, пожалуйста, дайте мне знать об этом

4b9b3361

Ответ 1

С справки Dockerfile:

  • Команда ARG определяет переменную, которую пользователи могут передать во время сборки разработчику с помощью команды сборки docker, используя --build-arg <varname>=<value>.

  • Команда ENV устанавливает переменную среды <key> в значение <value>.
    Переменные среды, заданные с использованием ENV, сохраняются, когда контейнер запускается из полученного изображения.

Поэтому, если вам нужна настройка времени сборки, ARG - ваш лучший выбор.
Если вам нужна настройка времени выполнения (для запуска того же изображения с разными настройками), ENV хорошо подходит.

Если я хочу добавить let say 20 (случайное число) расширений или любую другую функцию, которая может быть включена | disable

Учитывая количество задействованных комбинаций, лучше всего использовать ENV для установки этих функций во время выполнения.

Но вы можете комбинировать оба:

  • создание изображения с определенным ARG
  • используя ARG как ENV

То есть, с файлом Docker, включая:

ARG var
ENV var=${var}

Затем вы можете либо построить изображение с определенным значением var во время сборки (docker build --build-arg var=xxx), либо запустить контейнер с определенным значением времени выполнения (docker run -e var=yyy)