এআরজি বা ENV, এই ক্ষেত্রে কোনটি ব্যবহার করবেন?


121

এটি হতে পারে তুচ্ছ প্রশ্ন হতে পারে তবে এআরজি এবং এনভিভির জন্য ডকস পড়া আমার কাছে বিষয়গুলি পরিষ্কার করে দেয় না।

আমি একটি পিএইচপি-এফপিএম ধারক তৈরি করছি এবং আমি ব্যবহারকারীর প্রয়োজনে কিছু এক্সটেনশন সক্ষম / অক্ষম করার ক্ষমতা দিতে চাই।

এটি দুর্দান্ত হতে পারে যদি কন্ডিশনাল যোগ করে এবং বিল্ড কমান্ডে পতাকাগুলি প্রেরণ করে ডকফায়িলের মধ্যে এটি করা সম্ভব হয় তবে এএফএআইকি সমর্থন করে না।

আমার ক্ষেত্রে এবং আমার ব্যক্তিগত পদ্ধতির কনটেইনার শুরু হওয়ার সাথে সাথে একটি ছোট স্ক্রিপ্ট চালানো হবে যা নিম্নলিখিতগুলির মতো:

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

আমার Dockerfileদেখতে কেমন লাগে:

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

আমি কীভাবে কাজ করছি তা বোঝার জন্য আপনার যদি গভীরভাবে নজর নেওয়া দরকার তবে এখানে পুরো সংগ্রহস্থলটি দেওয়া হল

বর্তমানে এটি কাজ করছে তবে ... আমি যদি 20 টি (একটি এলোমেলো সংখ্যার) এক্সটেনশান বা সক্ষম করতে সক্ষম এমন অন্য কোনও বৈশিষ্ট্য যুক্ত করতে চাই তবে অক্ষম রাখি তবে আমি প্রয়োজনীয় 20 ENVটির সাথে শেষ করব (কারণ ডকফেরফিল সমর্থন করে না en ফাইল) সংজ্ঞা যার একমাত্র উদ্দেশ্য এই পতাকাটি সেট করা হবে স্ক্রিপ্টটি তখন কী করতে হবে তা জানতে দিন ...

  • এটি কি এটি সঠিক উপায়?
  • আমি ENVএই উদ্দেশ্যে ব্যবহার করা উচিত ?

এটি অর্জনের জন্য আপনার যদি আলাদা ধারণা থাকে তবে দয়া করে আমাকে এটি সম্পর্কে জানান I


যদি সেই এক্সটেনশনগুলি / বৈশিষ্ট্যগুলি এক বিল্ড থেকে অন্য বিল্ডে আলাদা হয়ে থাকে, তবে আপনার ARGপ্রতিটি বিল্ডের সাহায্যে সেগুলি আলাদা মান সহ সেট করার জন্য ব্যবহার করা উচিত --build-argএবং আপনি এখনও ডকফাইফাইলে ডিফল্ট মান ব্যবহার করতে পারেন। আপনি যদি ব্যবহার করেন তবে আপনার ENVপ্রতিটি বিল্ডের জন্য বিভিন্ন মান নির্ধারণের জন্য ডকস্পাইল নিজেই সম্পাদনা করতে হবে
এএ

উত্তর:


216

ডকফাইফাইল রেফারেন্স থেকে :

  • ARGনির্দেশ একটি পরিবর্তনশীল ব্যবহারকারীরা Docker বিল্ড কমান্ড ব্যবহার করে নির্মাতার বিল্ড-সময়ে পাস করতে পারেন সংজ্ঞায়িত --build-arg <varname>=<value>পতাকা।

  • ENVনির্দেশ এনভায়রনমেন্ট ভেরিয়েবল সেট করে <key>মান <value>
    পরিবেশিত ভেরিয়েবলগুলি সেট করে ব্যবহার করা ENVচিত্রটি থেকে কোনও ধারক চালিত হলে চলতে থাকবে।

সুতরাং আপনার যদি বিল্ড-টাইম কাস্টমাইজেশন প্রয়োজন হয় তবে ARGএটি আপনার সেরা পছন্দ।
আপনার যদি রান-টাইম কাস্টমাইজেশন (বিভিন্ন সেটিংস সহ একই চিত্র চালানোর জন্য) প্রয়োজন ENVহয় তবে এটি উপযুক্ত।

আমি যুক্ত করতে চাইলে চলুন 20 (একটি এলোমেলো সংখ্যার) এক্সটেনশান বা অন্য কোনও বৈশিষ্ট্য যা সক্ষম করতে পারা যায় | অক্ষম করুন

জড়িত সংমিশ্রণের সংখ্যা দেওয়া, ENVরানটাইমগুলিতে সেই বৈশিষ্ট্যগুলি সেট করতে ব্যবহার করা এখানে সেরা।

তবে আপনি উভয় দ্বারা একত্রিত করতে পারেন :

  • একটি নির্দিষ্ট সঙ্গে একটি ইমেজ নির্মাণ ARG
  • ARGএকটি হিসাবে এটি ব্যবহার করেENV

এটি হ'ল একটি ডকফায়াইল সহ:

ARG var
ENV var=${var}

এরপরে আপনি varবিল্ড-টাইম ( docker build --build-arg var=xxx) এ নির্দিষ্ট মান সহ একটি চিত্র তৈরি করতে পারেন বা একটি নির্দিষ্ট রানটাইম মান ( docker run -e var=yyy) সহ একটি ধারক চালাতে পারেন


1
দুর্দান্ত তবে ARGএগুলি কি স্ক্রিপ্ট থেকে অ্যাক্সেস করা যায় আমি ধারক স্টার্টআপে যাচ্ছি? যদি তাই হয়, কিভাবে? কীভাবে বাশ স্ক্রিপ্ট থেকে এগুলি অ্যাক্সেস করা যায় সে সম্পর্কে একটি সামান্য উদাহরণ যোগ করে আপনি কীভাবে নিজের উত্তরটি উন্নত করতে পারেন?
ReynierPM

@ReynierPM আপনার Dockerfile (বিল্ড সময়) ঘোষণা, দ্বারা পারবেন উপরন্তু এর ARG, একটি ENV var=${var}: দেখুন stackoverflow.com/a/33936014/6309 । ব্যবহার উভয়.
ভোনসি

আমি যদি আপনার পন্থাটি ব্যবহার করি varতবে কনটেইনারটি শুরু হওয়ার সাথে সাথে আমি কীভাবে ENV ভেরিয়েবলটি দিয়ে শেষ করব , আমি ঠিক আছি? অন্যথায় আমি আপনাকে মোটেও অনুসরণ করছি না। এটি মনে রাখবেন: স্ক্রিপ্টটি একটি স্থানীয় ফোল্ডার থেকে ধারকটিতে অনুলিপি হয়ে যায় এবং এটি ধারক সূচনাতে ব্যবহার করা হয়, এ কারণেই আমি এআগ্রের পরিবর্তে ENV ব্যবহার করছি কারণ আমি জানি না যে কন্টেনারটি কখন আরআরজিটি জীবিত অবস্থায় শুরু করবে এবং ভিতরে থেকে অ্যাক্সেস করা যাবে কিনা তা আমি জানি না don't একটি বাশ স্ক্রিপ্ট।
ReynierPM

আমি আমার ডকফাইফিল যুক্ত করেছি যাতে আপনি এটি একবার খেয়াল করতে পারেন এবং আমি বর্তমানে কী করছি তা জানতে পারবেন
রেইনিয়ার পিএম

1
উভয় @HardeepSingh: ENV ( stackoverflow.com/a/33836848/6309 ) এবং ARG ( stackoverflow.com/a/41593407/6309 )
VonC

0

সুতরাং যদি পরিবেশের পরিবর্তনশীলের মান প্রতিটি বিল্ডের জন্য আলাদা কিছুতে সেট করতে চান তবে আমরা বিল্ড সময় এই মানগুলি পাস করতে পারি এবং প্রতিবার আমাদের ডকার ফাইল পরিবর্তন করার দরকার নেই।

যখন ENVএকবার কমান্ড লাইনের মানগুলির মাধ্যমে সেটকে ওভাররাইট করা যায় না। সুতরাং, যদি আমরা বিভিন্ন পরিবেশের জন্য বিভিন্ন পরিবেশের জন্য আমাদের পরিবেশের পরিবর্তনশীল রাখতে চাই তবে আমরা ARGআমাদের ডকার ফাইলে ডিফল্ট মানগুলি ব্যবহার করতে এবং সেট করতে পারি । এবং যখন আমরা এই মানগুলি ওভাররাইট করতে চাই তখন আমরা --build-argsআমাদের ডকার ফাইল পরিবর্তন না করে প্রতিটি বিল্ড ব্যবহার করে এটি করতে পারি ।

অধিক বিবরণের জন্য, পাঠাতে পারেন এই

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.