programing

Docker 파일에서 환경 변수 값 가져오기

css3 2023. 8. 18. 22:50

Docker 파일에서 환경 변수 값 가져오기

루비 앱을 위한 컨테이너를 만들고 있습니다.내 앱의 구성은 환경 변수 내에 포함되어 있습니다(앱 내부에 dotenv와 함께 로드됨).

이러한 구성 변수 중 하나는 내부적으로 링크를 만드는 데 사용되는 앱의 공용 IP입니다.컨테이너 내부에서 127.0.0.1을 가리키는 dnsmasq 항목을 추가해야 앱의 링크를 컨테이너화되지 않은 것처럼 가져올 수 있습니다.

그러므로 나는 설정하려고 노력하고 있습니다.ENV환경 변수를 컨테이너에 전달하는 도커 파일에 있습니다.

저는 몇 가지를 시도했습니다.

ENV REQUEST_DOMAIN $REQUEST_DOMAIN
ENV REQUEST_DOMAIN `REQUEST_DOMAIN`

그러나 모든 항목은 환경 변수 값 대신 "REQUEST_DOMAIN" 문자열을 전달합니다.호스트 시스템에서 컨테이너로 환경 변수 값을 전달하는 방법이 있습니까?

이 목적을 위해 작성된 Docker 파일의 지침을 사용해야 합니다.

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

Docker 파일의 행은 다음과 같습니다.

ARG request_domain

또는 기본값을 원하는 경우:

ARG request_domain=127.0.0.1

이제 도커 파일 내에서 이 변수를 참조할 수 있습니다.

ENV request_domain=$request_domain

그런 다음 컨테이너를 다음과 같이 구성합니다.

$ docker build --build-arg request_domain=mydomain Dockerfile


참고 1: 참조한 경우 이미지가 빌드되지 않습니다.ARG도커 파일에 있지만 제외됨--build-arg.

참고 2: 사용자가 Docker 파일에 정의되지 않은 빌드 인수를 지정하면 빌드는 다음과 같은 경고를 출력합니다.

[경고] 하나 이상의 빌드 인수 [foo]가 사용되지 않았습니다.

따라서 다음을 수행할 수 있습니다.cat Dockerfile | envsubst | docker build -t my-target -

그런 다음 다음과 같은 Docker 파일이 있습니다.

ENV MY_ENV_VAR $MY_ENV_VAR

일부 특수 문자에 문제가 있을 수 있지만, 적어도 대부분의 경우에는 효과가 있습니다.

이것은 도커에서 env 변수를 전달하려는 사람들을 위한 것입니다..env빌드하는 동안 파일에서 도커 파일로 이동한 다음 이러한 인수를 env 변수로 컨테이너에 전달합니다.일반적인 도커 합성 파일

services:
  web:
    build:
      context: ./api
      dockerfile: Dockerfile
      args:
        - SECRET_KEY=$SECRET_KEY
        - DATABASE_URL=$DATABASE_URL
        - AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID

에 있는 env 변수 전달.env빌드 명령의 인수에 파일을 추가합니다.전형적인..env파일

SECRET_KEY=blahblah
DATABASE_URL=dburl

이제 docker-compose up -d 명령을 실행하면 docker-compose 파일이 .env 파일에서 값을 가져온 다음 이 값을 docker-compose 파일로 전달합니다.이제 웹의 도커 파일에는 빌드하는 동안 인수를 통해 모든 변수가 포함되어 있습니다.웹의 전형적인 도커 파일입니다.

FROM python:3.6-alpine

ARG SECRET_KEY
ARG DATABASE_URL
ARG AWS_ACCESS_KEY_ID
ARG AWS_SECRET_ACCESS_KEY
ARG AWS_BUCKET
ARG AWS_REGION
ARG CLOUDFRONT_DOMAIN

ENV CELERY_BROKER_URL redis://redis:6379/0
ENV CELERY_RESULT_BACKEND redis://redis:6379/0
ENV C_FORCE_ROOT true
ENV SECRET_KEY  ${SECRET_KEY?secretkeynotset}
ENV DATABASE_URL ${DATABASE_URL?envdberror}

이제 우리는 그 secret_key와 dburl을 doker 파일의 arg로 받았습니다. 이제 제사보겠다니습해에 있는 사용해 .ENV~하듯이ENV SECRET_KEY ${SECRET_KEY?secretkeynotset}도커 컨테이너도 환경에 이러한 변수가 있습니다.(제가 한) 사용하지 않는 것을 기억하세요. 그래야 합니다.

를 :envsubst▁like않고와 같은 명령어를 할 수 않고,COPY또는ADD중간 파일을 사용하지 않으면 Bash의 프로세스 대체를 사용할 수 있습니다.

docker build -f <(envsubst < Dockerfile) -t my-target .

런타임에 생성한 파일에서 환경 변수를 로드합니다.

export MYVAR="my_var_outside"
cat > build/env.sh <<EOF
MYVAR=${MYVAR}
EOF

도커 파일에서.

ADD build /build
RUN /build/test.sh

어디서 테스트를 합니까?sh는 env.sh 에서 MYVAR를 로드합니다.

#!/bin/bash
. /build/env.sh
echo $MYVAR > /tmp/testfile

Docker 파일에서 모든 환경 변수($ExampleEnvVar)를 찾아 교체한 후 빌드하려는 경우 다음과 같이 작업할 수 있습니다.

envsubst < /path/to/Dockerfile | docker build -t myDockerImage . -f -

을 할 때build-arg...

docker build --build-arg CODE_VERSION=1.2 Dockerfile

할 수 을 나타냅니다.이후에는 변수를 사용할 수 없음을 확인합니다.FROM:

ARG  CODE_VERSION=latest
FROM base:${CODE_VERSION}

안 안ARG에선 앞에 된.FROM빌드 단계를 벗어났기 때문에 이후의 어떤 지침에도 사용할 수 없습니다.FROM.

으로 반적으로.ARG는 s 다 에 배 합야니다해치는 뒤에 .FROM중에 필요하지 않은 경우에는FROM:

FROM base:xy
ARG  ABC=123

ARG 번째 첫번보다먼선된언저째 FROM을 사용합니다.ARG빌드 단계 내부의 값이 없는 명령:

ARG VERSION=latest
FROM busybox:$VERSION
ARG VERSION
RUN echo $VERSION > image_version

https://docs.docker.com/engine/reference/builder/ #설명 방법 및 출처 이해

컨테이너 시작 시 env 변수를 직접 전달할 수 있습니다.

docker run -e [your_variable_name = your_variable_value] [image to instanciate]

예:

docker run --rm -e TARGET=192.168.1.9 ubuntu env

출력은 다음과 같습니다.

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=36399469e519
TARGET=192.168.1.9
HOME=/root

대상 변수가 현재 컨테이너의 환경 변수에 추가되었습니다!

더하다-e환경 변수를 컨테이너에 전달하기 위한 키입니다.예:

$ MYSQLHOSTIP=$(sudo docker inspect -format="{{ .NetworkSettings.IPAddress }}" $MYSQL_CONRAINER_ID)
$ sudo docker run -e DBIP=$MYSQLHOSTIP -i -t myimage /bin/bash

root@87f235949a13:/# echo $DBIP
172.17.0.2

언급URL : https://stackoverflow.com/questions/19537645/get-environment-variable-value-in-dockerfile