To może być trywialne pytanie, ale czytanie dokumentacji dla ARG i ENV nie wyjaśnia mi sprawy.
Buduję kontener PHP-FPM i chcę dać możliwość włączania / wyłączania niektórych rozszerzeń na potrzeby użytkownika.
Byłoby wspaniale, gdyby można to zrobić w pliku Dockerfile, dodając warunki warunkowe i przekazując flagi w poleceniu kompilacji, być może, ale AFAIK nie jest obsługiwany.
W moim przypadku i moim osobistym podejściem jest uruchomienie małego skryptu podczas uruchamiania kontenera, coś takiego:
#!/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 "$@"
Tak Dockerfile
wygląda mój wygląd:
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
Oto całe repozytorium, jeśli potrzebujesz dokładniejszego przyjrzenia się, aby zrozumieć, jak robię rzeczy
Obecnie to działa, ale ... Jeśli chcę dodać, powiedzmy, 20 (losową liczbę) rozszerzeń lub jakąkolwiek inną funkcję, którą można włączyć | wyłączyć, skończę z 20 niepotrzebnymi ENV
(ponieważ Dockerfile nie obsługuje .env files), której jedynym celem byłoby ustawienie tej flagi, aby skrypt wiedział, co wtedy zrobić ...
- Czy to jest właściwy sposób?
- Powinienem używać
ENV
do tego celu?
Jestem otwarty na pomysły, jeśli masz inne podejście do osiągnięcia tego celu, daj mi o tym znać
ARG
aby ustawić dla nich różne wartości przy każdej kompilacji--build-arg
, i nadal można używać wartości domyślnych w pliku Dockerfile. Jeśli używaszENV
, musisz edytować sam plik Dockerfile dla każdej kompilacji, aby ustawić inne wartości