programing

ARG 또는 ENV, 이 경우 어떤 것을 사용해야 합니까?

elecom 2023. 8. 11. 21:30
반응형

ARG 또는 ENV, 이 경우 어떤 것을 사용해야 합니까?

이것은 사소한 질문일 수 있지만 ARG와 ENV를 위한 문서를 읽는 것은 저에게 명확하지 않습니다.

저는 PHP-FPM 컨테이너를 만들고 있으며 사용자 요구에 대한 일부 확장을 활성화/비활성화할 수 있는 기능을 제공하고 싶습니다.

조건을 추가하고 빌드 명령에 플래그를 전달하여 도커 파일에서 이 작업을 수행할 수 있다면 좋겠지만 AFAIK는 지원되지 않습니다.

저의 경우와 개인적인 접근 방식은 컨테이너가 시작될 때 다음과 같은 작은 스크립트를 실행하는 것입니다.

#!/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(Docker 파일이 .env 파일을 지원하지 않기 때문에) 이 플래그를 설정하는 유일한 목적은 스크립트가 수행할 작업을 알 수 있도록 하는 것입니다.

  • 이것이 그것을 하는 올바른 방법입니까?
  • 사용할까요?ENV이런 목적으로?

이를 달성하기 위한 다른 접근 방식이 있다면 저에게 알려주시기 바랍니다.

도커 파일 참조에서:

  • ARG명령은 사용자가 빌드 시 도커 빌드 명령을 사용하여 빌드에 전달할 수 있는 변수를 정의합니다.--build-arg <varname>=<value>깃발

  • ENV명령은 환경 변수를 설정합니다.<key>가치 있는<value>.
    다음을 사용하여 설정된 환경 변수ENV결과 이미지에서 컨테이너가 실행될 때 계속됩니다.

빌드 타임 커스터마이징이 필요하다면,ARG당신의 최선의 선택입니다.
다른 설정으로 동일한 이미지를 실행하기 위해 런타임 사용자 정의가 필요한 경우ENV잘 다듬어져 있습니다.

추가하려면 20(난수)의 확장 또는 활성화할 수 있는 다른 기능을 사용하지 않도록 설정합니다.

관련된 조합의 수를 고려할 때, 사용ENV런타임에 이러한 기능을 설정하는 것이 가장 좋습니다.

그러나 다음과 같은 방법으로 두 가지를 결합할 수 있습니다.

  • 특정 이미지 구축ARG
  • 그것을 이용하여ARG한 사람으로서ENV

즉, 다음을 포함하는 Docker 파일을 사용합니다.

ARG var
ENV var=${var}

그런 다음 특정 이미지를 빌드할 수 있습니다.var빌드 시간의 가치(docker build --build-arg var=xxx) 또는 특정 런타임 값으로 컨테이너를 실행합니다(docker run -e var=yyy)

따라서 환경 변수 값을 모든 빌드에 대해 다른 값으로 설정하려는 경우 빌드 시간 동안 이 값을 전달할 수 있으므로 도커 파일을 매번 변경할 필요가 없습니다.

하는 동안에ENV한 번 설정하면 명령줄 값을 통해 덮어쓸 수 없습니다. 값을 하려면 를 사용할 수 .ARG도커 파일에 기본값을 설정합니다.그리고 이러값덮면다사음여용하를 .--build-args도커 파일을 변경하지 않고 모든 빌드에서 사용할 수 있습니다.

자세한 내용은 이것을 참고하시면 됩니다.

한 개의 추가 트립와이어: ARG 기본값을 FROM 절 앞과 아래에서 사용하는 경우 중복된 정의가 필요합니다.그래서 대신에

ARG var1=default1
FROM your_base:${var1}
ENV var1=${var1}  # <- this will fail!; the ARG var1 default is empty

니가 필요한

ARG var1=default1
FROM your_base:${var1}
ARG var1=default1
ENV var1=${var1}  # <- this works

기본값(예에서는 기본값 1)을 두 번 모두 동일한 값으로 수동/명시적으로 설정해야 합니다.ARG 변수에 대해 FROM 문 앞/뒤에 두 가지 기본값을 설정할 수 있습니다.

사용해야 하는 이유ARG또는ENV?

를들어가, 리우예가 .jar우리는 그것의 도커 이미지를 만들고 싶습니다.그래서, 우리는 그것을 어떤 도커 엔진에도 선적할 수 있습니다.

우리는 쓸 수 있습니다.Dockerfile.

도커 파일

FROM eclipse-temurin:17-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

메이븐을 사용하여 도커 이미지를 구축하려면 다음 단계를 통과할 수 있습니다.JAR_FILE 사용--build-arg~하듯이target/*.jar

docker build --build-arg JAR_FILE=target/*.jar -t myorg/myapp 

그러나 Gradle을 사용하는 경우 위의 명령이 작동하지 않으므로 다른 경로를 통과해야 합니다.build/libs/

docker build --build-arg JAR_FILE=build/libs/*.jar -t myorg/myapp .

빌드 시스템을 선택하면 ARG가 필요하지 않습니다.JAR 위치를 하드 코딩할 수 있습니다.

메이븐의 경우 다음과 같습니다.

도커 파일

FROM eclipse-temurin:17-jdk-alpine
VOLUME /tmp
COPY target/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

여기서 다음 명령을 사용하여 이미지를 작성할 수 있습니다.

docker build -t image:tag .

ENV를 언제 사용해야 합니까?

실행 중인 컨테이너에 몇 가지 값을 설정하고 응용 프로그램이 실행/수신할 수 있는 포트 번호와 같은 이미지에 반영하려는 경우.다음을 사용하여 설정할 수 있습니다.ENV.

둘다요.ARG그리고.ENV매우 흡사해 보입니다. 모두 NAT의 NAT 수 .Dockerfile명령을 사용할 수 있습니다.

예:

ARG VAR_A 5
ENV VAR_B 6
RUN echo $VAR_A
RUN echo $VAR_B

개인 옵션!

ENV보다 ARG를 선택하는 것 사이에는 절충점이 있습니다.ARG를 선택하면 나중에 실행 중에 변경할 수 없습니다.그러나 ENV를 선택한 경우 컨테이너의 값을 수정할 수 있습니다.

나는 개인적으로 선호합니다.ARG1파운드가 ENV제가 할 수 있는 곳이면 어디든, 예를 들면,

위의 예:

사용한 적이 있습니다.ARG런타임이 아닌 빌드 중에 빌드 시스템 메이븐 또는 그라들이 영향을 미치기 때문입니다.따라서 많은 세부 정보를 캡슐화하고 런타임에 대한 최소 인수 집합을 제공합니다.

자세한 내용은 이것을 참고하시면 됩니다.

언급URL : https://stackoverflow.com/questions/41916386/arg-or-env-which-one-to-use-in-this-case

반응형