ARG veya ENV, bu durumda hangisi kullanılmalı?


122

Bu belki önemsiz bir soru olabilir, ancak ARG ve ENV için dokümanları okumak bana her şeyi netleştirmiyor.

Bir PHP-FPM konteyneri oluşturuyorum ve kullanıcı ihtiyaçlarıyla ilgili bazı uzantıları etkinleştirme / devre dışı bırakma yeteneği vermek istiyorum.

Bu, Dockerfile'da koşullu ekleyerek ve build komutuna bayrakları geçirerek yapılabilirse harika olurdu, ancak AFAIK desteklenmiyor.

Benim durumumda ve kişisel yaklaşımım, kapsayıcı başladığında aşağıdaki gibi küçük bir komut dosyası çalıştırmaktır:

#!/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 "$@"

Şöyle Dockerfilegörünüyor:

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

İşte size bir şeyleri yapıyorum nasıl anlamak için derin bir bakmak gerekirse bütün deposudur

Şu anda bu çalışıyor ama ... Eğer 20 (rastgele bir sayı) uzantı veya etkinleştirilebilecek başka bir özellik eklemek istersem | devre dışı bırak o zaman gerekli olmayan 20 ile ENVbitireceğim (çünkü Dockerfile .env'yi desteklemiyor dosya) tanımı, komut dosyasının ne yapacağını bilmesine izin vermek için tek amacı bu bayrağı ayarlamak olacaktı ...

  • Bunu yapmanın doğru yolu bu mu?
  • ENVBu amaçla kullanmalı mıyım ?

Bunu başarmak için farklı bir yaklaşımınız varsa fikirlere açığım, lütfen bana bildirin


Bu uzantılar / özellikler bir derlemeden diğerine farklı olacaksa, bunları her derlemede ARGfarklı değerlerle ayarlamak için --build-argkullanmalısınız ve Dockerfile'da yine de varsayılan değerleri kullanabilirsiniz. Eğer kullanırsanız ENV, farklı değerleri ayarlamak için her yapı için düzenlemek Dockerfile kendisi gerekir
AA

Yanıtlar:


217

Gönderen Dockerfile referans :

  • ARGTalimat kullanıcıları kullanarak liman işçisi inşa komutuyla oluşturucu derleme sırasında geçirebilmesi bir değişken tanımlar --build-arg <varname>=<value>bayrak.

  • ENVTalimat ortam değişkenini ayarlar <key>değere <value>.
    Kullanılarak ayarlanan ortam değişkenleri ENV, elde edilen görüntüden bir kap çalıştırıldığında devam edecektir.

Dolayısıyla, derleme zamanı özelleştirmesine ihtiyacınız varsa ARG, en iyi seçiminiz budur.
Çalışma zamanı özelleştirmesine ihtiyacınız varsa (aynı görüntüyü farklı ayarlarla çalıştırmak için), ENVçok uygundur.

20 (rastgele sayıda) uzantı veya etkinleştirilebilecek başka bir özellik eklemek istersem | devre dışı bırak

Dahil olan kombinasyonların sayısı göz önüne alındığında, ENVbu özellikleri çalışma zamanında ayarlamak için kullanmak burada en iyisidir.

Ancak ikisini de şu şekilde birleştirebilirsiniz :

  • belirli bir ARG
  • bunu ARGbirENV

Yani, aşağıdakileri içeren bir Dockerfile ile:

ARG var
ENV var=${var}

Daha sonra var, derleme zamanında ( docker build --build-arg var=xxx) belirli bir değere sahip bir görüntü oluşturabilir veya belirli bir çalışma zamanı değerine ( docker run -e var=yyy) sahip bir kapsayıcı çalıştırabilirsiniz.


1
Harika ama bunlara ARGkonteyner başlangıcında çalıştırdığım komut dosyasından erişilebilir? Öyleyse nasıl? Bir bash betiğinden bunlara nasıl erişilebileceğine dair küçük bir örnek ekleyerek cevabınızı iyileştirebilir misiniz?
ReynierPM

@ReynierPM sen de, senin Dockerfile (build zaman) içinde ilan ederek yapabilirsiniz ek ait ARGbir ENV var=${var}: bkz stackoverflow.com/a/33936014/6309 . İkisini de kullan.
VonC

Yaklaşımınızı kullanırsam, ne olursa olsun var, başladığında kapta bir ENV değişkeni ile sonuçlanır , haklı mıyım? Aksi takdirde seni hiç takip etmiyorum. Şunu hatırlayın: komut dosyası yerel bir klasörden konteynere kopyalanır ve konteynır başlatıldığında kullanılır, bu yüzden ARG yerine ENV kullanıyorum çünkü konteynerin ARG'yi ne zaman başlattığını ve içeriden erişilebilir olup olmadığını bilmiyorum bir bash betiği.
ReynierPM

Dockerfile'ımı ekledim, böylece ona bir göz atabilir ve şu anda ne yaptığımı
öğrenebilirsiniz

1
@HardeepSingh Hem ENV ( stackoverflow.com/a/33836848/6309 ) hem de ARG ( stackoverflow.com/a/41593407/6309 )
VonC

0

Dolayısıyla, bir ortam değişkeninin değerini her derleme için farklı bir şeye ayarlamak isterseniz, bu değerleri derleme sırasında geçirebiliriz ve her seferinde docker dosyamızı değiştirmemize gerek kalmaz.

Bununla birlikte ENV, bir kez setin üzerine komut satırı değerleri ile yazılamaz. Dolayısıyla, ortam değişkenimizin farklı yapılar için farklı değerlere sahip olmasını istiyorsak, ARGdocker dosyamızda varsayılan değerleri kullanabilir ve ayarlayabiliriz. Ve bu değerlerin üzerine yazmak istediğimizde, bunu kullanarak yapabiliriz.--build-args docker dosyamızı değiştirmeden her derlemede .

Daha fazla ayrıntı için, başvurabilir bu .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.