Questa potrebbe essere una domanda banale, ma leggere documenti per ARG ed ENV non mi rende le cose chiare.
Sto costruendo un contenitore PHP-FPM e voglio dare la possibilità di abilitare / disabilitare alcune estensioni sulle esigenze dell'utente.
Sarebbe bello se questo potesse essere fatto nel Dockerfile aggiungendo condizionali e passando flag sul comando di compilazione, forse, ma AFAIK non è supportato.
Nel mio caso e il mio approccio personale è quello di eseguire un piccolo script all'avvio del contenitore, qualcosa di simile al seguente:
#!/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 "$@"
Ecco come Dockerfile
appare il mio :
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
Ecco l'intero repository se hai bisogno di dare uno sguardo approfondito per capire come sto facendo le cose
Attualmente funziona ma ... Se voglio aggiungere diciamo 20 (un numero casuale) di estensioni o qualsiasi altra funzionalità che può essere abilitata | disabilitata, ENV
finirò con 20 non necessarie (perché Dockerfile non supporta .env file) definizione il cui unico scopo sarebbe impostare questo flag per far sapere allo script cosa fare allora ...
- È questo il modo giusto per farlo?
- Dovrei usare
ENV
per questo scopo?
Sono aperto alle idee, se hai un approccio diverso per raggiungere questo obiettivo, fammelo sapere
ARG
per impostarle con valori diversi con ciascuna build che usa--build-arg
e puoi ancora usare i valori predefiniti nel Dockerfile. Se lo usiENV
, dovresti modificare il Dockerfile stesso per ogni build per impostare valori diversi