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
'programing' 카테고리의 다른 글
| Oracle에서 날짜에 선행 0을 추가하려면 어떻게 해야 합니까? (0) | 2023.08.11 |
|---|---|
| org.springframework.mail.javamail을 자동으로 배선할 수 없습니다.JavaMailSender (0) | 2023.08.11 |
| Alamofire와 함께 본문에 단순 문자열이 포함된 POST 요청 (0) | 2023.08.11 |
| 안드로이드 개발용 MS Visual Studio를 어떻게 사용할 수 있습니까? (0) | 2023.08.11 |
| 'Install-Module' 용어가 cmdlet의 이름으로 인식되지 않습니다. (0) | 2023.08.11 |