Ini mungkin pertanyaan yang sepele tetapi membaca dokumen untuk ARG dan ENV tidak menjelaskan semuanya kepada saya.
Saya membangun wadah PHP-FPM dan saya ingin memberikan kemampuan untuk mengaktifkan / menonaktifkan beberapa ekstensi sesuai kebutuhan pengguna.
Akan lebih bagus jika ini bisa dilakukan di Dockerfile dengan menambahkan kondisional dan meneruskan flag pada perintah build mungkin tetapi AFAIK tidak didukung.
Dalam kasus saya dan pendekatan pribadi saya adalah menjalankan skrip kecil saat penampung dimulai, seperti berikut ini:
#!/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 "$@"
Seperti inilah Dockerfile
penampilanku:
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
Berikut adalah keseluruhan repositori jika Anda perlu melihat lebih dalam untuk memahami bagaimana saya melakukan sesuatu
Saat ini ini berfungsi tetapi ... Jika saya ingin menambahkan katakanlah 20 (nomor acak) ekstensi atau fitur lain yang dapat diaktifkan | nonaktifkan maka saya akan mengakhiri dengan 20 tidak diperlukan ENV
(karena Dockerfile tidak mendukung .env files) definisi yang satu-satunya tujuan akan ditetapkan bendera ini untuk membiarkan skrip tahu apa yang harus dilakukan kemudian ...
- Apakah ini cara yang benar untuk melakukannya?
- Haruskah saya gunakan
ENV
untuk tujuan ini?
Saya terbuka untuk ide jika Anda memiliki pendekatan berbeda untuk mencapai ini, beri tahu saya tentang hal itu
ARG
untuk mengaturnya dengan nilai yang berbeda dengan setiap build yang digunakan--build-arg
, dan Anda masih dapat menggunakan nilai default di Dockerfile. Jika Anda menggunakanENV
, Anda perlu mengedit Dockerfile itu sendiri untuk setiap build guna menetapkan nilai yang berbeda