Đây có thể là một câu hỏi tầm thường nhưng việc đọc tài liệu về ARG và ENV không giúp tôi hiểu rõ mọi thứ.
Tôi đang xây dựng một vùng chứa PHP-FPM và tôi muốn cung cấp khả năng bật / tắt một số tiện ích mở rộng theo nhu cầu của người dùng.
Sẽ thật tuyệt nếu điều này có thể được thực hiện trong Dockerfile bằng cách thêm các điều kiện và chuyển cờ trên lệnh xây dựng có lẽ nhưng AFAIK không được hỗ trợ.
Trong trường hợp của tôi và cách tiếp cận cá nhân của tôi là chạy một tập lệnh nhỏ khi vùng chứa bắt đầu, giống như sau:
#!/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 "$@"
Đây là cách tôi Dockerfile
trông như thế này:
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
Đây là toàn bộ kho lưu trữ nếu bạn cần xem xét sâu để hiểu cách tôi đang làm mọi việc
Hiện tại điều này đang hoạt động nhưng ... Nếu tôi muốn thêm, giả sử 20 (một số ngẫu nhiên) tiện ích mở rộng hoặc bất kỳ tính năng nào khác có thể bật | tắt thì tôi sẽ kết thúc bằng 20 không cần thiết ENV
(vì Dockerfile không hỗ trợ .env tệp) định nghĩa có mục đích duy nhất sẽ được đặt cờ này để cho tập lệnh biết phải làm gì sau đó ...
- Đây có phải là cách đúng đắn để làm việc này?
- Tôi có nên sử dụng
ENV
cho mục đích này không?
Tôi cởi mở với những ý tưởng nếu bạn có cách tiếp cận khác để đạt được điều này, vui lòng cho tôi biết về nó
ARG
để đặt chúng với các giá trị khác nhau với mỗi bản dựng đang sử dụng--build-arg
và bạn vẫn có thể sử dụng các giá trị mặc định trong Dockerfile. Nếu bạn sử dụngENV
, bạn sẽ cần phải chỉnh sửa Dockerfile cho mỗi bản dựng để đặt các giá trị khác nhau