Dies könnte vielleicht eine triviale Frage sein, aber das Lesen von Dokumenten für ARG und ENV macht mir die Dinge nicht klar.
Ich baue einen PHP-FPM-Container und möchte die Möglichkeit geben, einige Erweiterungen je nach 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 erfolgen könnte, aber AFAIK wird nicht unterstützt.
In meinem Fall und meinem persönlichen Ansatz besteht es darin, beim Starten des Containers ein kleines Skript auszuführen, etwa wie folgt:
#!/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 "$@"
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 mache
Derzeit funktioniert dies, aber ... Wenn ich beispielsweise 20 (eine zufällige Anzahl) Erweiterungen oder eine andere Funktion hinzufügen möchte, die aktiviert oder deaktiviert werden kann, werde ich mit 20 nicht erforderlich ENV
enden (da Dockerfile .env nicht unterstützt Dateien) Definition, deren einziger Zweck darin besteht, dieses Flag zu setzen, damit das Skript weiß, was dann zu tun ist ...
- Ist das der richtige Weg?
- Soll ich
ENV
für diesen Zweck verwenden?
Ich bin offen für Ideen, wenn Sie einen anderen Ansatz haben, um dies zu erreichen, lassen Sie es mich bitte wissen
ARG
sie bei jedem Build mit unterschiedlichen Werten--build-arg
festlegen. Sie können weiterhin Standardwerte in der Docker-Datei verwenden. Wenn Sie verwendenENV
, müssten Sie die Docker-Datei selbst für jeden Build bearbeiten, um unterschiedliche Werte festzulegen