wake-up-neo.com

ARG oder ENV, welches soll man in diesem Fall verwenden?

Dies könnte vielleicht eine triviale Frage sein, aber das Lesen von Dokumenten für ARG und ENV doesn ' t Dinge klar zu mir.

Ich erstelle einen PHP-FPM-Container und möchte die Möglichkeit geben, einige Erweiterungen für Benutzeranforderungen zu aktivieren/deaktivieren.

Wäre großartig, wenn dies in der Docker-Datei durch Hinzufügen von Bedingungen und Übergeben von Flags für den Build-Befehl geschehen könnte, aber AFAIK wird nicht unterstützt.

In meinem Fall und meinem persönlichen Ansatz ist es, ein kleines Skript auszuführen, wenn der Container gestartet wird.

#!/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]"

So sieht mein Dockerfile aus:

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

Hier ist das gesamte Repository, wenn Sie einen tiefen Blick darauf werfen müssen, um zu verstehen, wie ich Dinge tue

Derzeit funktioniert dies, aber ... Wenn ich beispielsweise 20 (eine zufällige Zahl) Erweiterungen oder andere Funktionen hinzufügen möchte, die aktiviert | deaktiviert werden können, werde ich mit 20 enden, die nicht erforderlich sind ENV (weil Dockerfile) unterstützt keine .env-Dateien) Definition, deren einziger Zweck es wäre, dieses Flag zu setzen, damit das Skript weiß, was dann zu tun ist ...

  • Ist das der richtige Weg?
  • Sollte ich ENV für diesen Zweck verwenden?

Ich bin offen für Ideen, wenn Sie einen anderen Ansatz haben, lassen Sie es mich bitte wissen

92
ReynierPM

Von Dockerfile-Referenz :

  • Die Anweisung ARG definiert eine Variable, die Benutzer beim Erstellen mit dem Befehl docker build unter Verwendung des Flags --build-arg <varname>=<value> An den Builder übergeben können.

  • Die Anweisung ENV setzt die Umgebungsvariable <key> Auf den Wert <value>.
    Die mit ENV festgelegten Umgebungsvariablen bleiben bestehen, wenn ein Container aus dem resultierenden Image ausgeführt wird.

Wenn Sie also eine Anpassung zur Erstellungszeit benötigen, ist ARG Ihre beste Wahl.
Wenn Sie eine Anpassung zur Laufzeit benötigen (um dasselbe Image mit unterschiedlichen Einstellungen auszuführen), ist ENV gut geeignet.

Wenn ich hinzufügen möchte, sagen wir 20 (eine zufällige Zahl) von Erweiterungen oder eine andere Funktion, die aktiviert | deaktiviert werden kann

Angesichts der Anzahl der beteiligten Kombinationen ist es hier am besten, ENV zu verwenden, um diese Funktionen zur Laufzeit festzulegen.

Aber Sie können beide kombinieren durch:

  • bild mit einem bestimmten ARG erstellen
  • verwenden dieses ARG als ENV

Das heißt, mit einer Docker-Datei, die Folgendes enthält:

ARG var
ENV var=${var}

Sie können dann entweder ein Image mit einem bestimmten var Wert zur Erstellungszeit erstellen (docker build --build-arg var=xxx) Oder einen Container mit einem bestimmten Laufzeitwert ausführen (docker run -e var=yyy).

168
VonC