Docker에서 환경 변수 설정

David Mbochi Njonge 2023년6월20일
  1. 새 프로젝트 만들기
  2. Dockerfile 만들기
  3. ARG 명령을 사용하여 환경 변수 설정
  4. ENV 명령을 사용하여 환경 변수 설정
  5. 환경 변수를 동적으로 설정
  6. 결론
Docker에서 환경 변수 설정

환경 변수는 애플리케이션 개발을 돕기 위해 추가 구성 또는 메타데이터를 추가하는 데 사용되며 다양한 형태로 존재할 수 있습니다.

예를 들어 Java 애플리케이션을 개발할 때 일반적으로 애플리케이션을 컴파일하고 실행할 수 있도록 Java 개발 키트 위치를 가리키는 환경 변수를 설정합니다.

마찬가지로 Docker를 사용하여 애플리케이션을 개발할 때 컨테이너에 대한 환경 변수를 설정할 수 있습니다. 이 튜토리얼에서는 ENV 변수를 설정하는 방법과 필요한 경우 실행 중인 컨테이너에서 변수에 액세스하는 방법을 배웁니다.

새 프로젝트 만들기

WebStorm IDEA를 열고 파일 > 새로 만들기 > 프로젝트를 선택합니다. 열리는 창에서 Node.js를 선택하고 프로젝트 이름을 제목 없음에서 docker-env-variables로 변경하거나 원하는 이름을 사용하십시오.

노드 인터프리터패키지 관리자 섹션이 컴퓨터에서 자동으로 추가될 수 있도록 노드 런타임 환경을 설치했는지 확인하십시오. 마지막으로 만들기 버튼을 눌러 프로젝트를 생성합니다.

우리 애플리케이션은 expressjs를 사용하므로 다음 명령을 사용하여 애플리케이션에 expressjs를 설치합니다.

~/WebstormProjects/docker-env-variables$ npm install express

expressjs를 설치한 후 docker-env-variables 폴더에 index.js라는 파일을 만들고 다음 코드를 복사하여 파일에 붙여넣습니다.

const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => {
    res.json(
        [{
            name: 'Lenovo Legion 5 pro',
            type: 'electronic',
            price: 1500
        },
            {
                name: 'Xiaomi pro 14',
                type: 'electronic',
                price: 1300
            },
        ])
})

app.listen(port, () => {
    console.log(`Example app listening on port ${port}`)
})

이 파일에서 우리는 전자 상거래 환경에서 일련의 제품을 반환하는 애플리케이션을 시뮬레이트했으며 이 애플리케이션을 사용하여 이 튜토리얼에서 다루는 예제를 테스트할 것입니다.

Dockerfile 만들기

docker-env-variables 폴더에 Dockerfile이라는 파일을 만듭니다. Dockerfile은 사용자 지정 이미지에 대한 구성을 정의하는 데 도움이 되는 파일입니다.

환경 변수를 설정하는 데 사용할 수 있는 두 가지 방법이 있습니다: ARG 명령 및 ENV 명령.

이 두 명령의 차이점은 실행 중인 컨테이너는 ARG 명령을 사용하여 설정된 환경 변수에 액세스할 수 없다는 것입니다. 이러한 변수는 이미지를 빌드할 때만 사용할 수 있기 때문입니다. 다음 섹션에서는 이러한 지침을 사용하여 목표를 달성하는 방법을 보여줍니다.

ARG 명령을 사용하여 환경 변수 설정

이전 섹션에서 만든 Dockerfile이라는 파일에 다음 지침을 복사하여 붙여넣습니다.

FROM node:16.17.0-alpine
ARG APP_NAME
ARG APP_VERSION=1.0.0
RUN echo "build an image of ${APP_NAME} version ${APP_VERSION}"
WORKDIR /com/ecommerce
ADD package*.json ./
RUN npm install
COPY . .
CMD node index.js

FROM 명령은 사용자 정의 이미지를 생성할 기본 이미지를 설정합니다. 우리의 경우에는 Node.js의 경량 버전을 가져오는 alpine을 사용했습니다.

ARG는 Docker 빌더가 이미지를 빌드하는 데 사용할 수 있는 변수를 정의합니다. 이 명령을 사용하여 제공되는 변수는 필수 또는 선택 사항일 수 있습니다.

Docker 설명서는 다른 지침을 읽을 수 있는 참조를 제공합니다.

이 경우 APP_NAME이라는 선택적 변수와 APP_VERSION이라는 필수 변수를 제공했습니다.

이러한 변수는 이미지를 빌드할 때만 사용할 수 있습니다. 다음 섹션에서 이를 확인합니다.

이미지 만들기

아래 명령을 사용하여 docker-env:latest 태그가 있는 이미지를 빌드합니다.

~/WebstormProjects/docker-env-variables$ docker build --tag docker-env:latest .

이 명령은 Dockerfile을 순차적으로 실행하며 아래와 같이 실행되는 각 단계를 볼 수 있습니다.

 => [1/6] FROM docker.io/library/node:16.17.0-alpine@sha256:2c405ed42fc0fd6aacbe5730042640450e5ec030bada7617beac88f742b6  0.0s
 => CACHED [2/6] RUN echo "build an image of ${APP_NAME} version 1.0.0"                                                   0.0s
 => [3/6] WORKDIR /com/ecommerce                                                                                          0.6s
 => [4/6] ADD package*.json ./                                                                                            0.8s
 => [5/6] RUN npm install                                                                                                 6.7s
 => [6/6] COPY . .

이미지를 빌드할 때 아래와 같이 --build-arg 명령을 사용하여 빈 환경 변수의 값을 제공하거나 기본 환경 값을 재정의할 수 있습니다.

~/WebstormProjects/docker-env-variables$ docker build --build-arg APP_NAME=ecommerce-app --tag docker-env:latest .

컨테이너 실행

아래 명령을 사용하여 호스트에서 포트 3000을 노출하는 docker-env-prod라는 컨테이너를 실행합니다.

~/WebstormProjects/docker-env-variables$ docker run --name docker-env-prod -d -p 3000:3000 docker-env:latest

이 명령은 응용 프로그램의 인스턴스를 실행하며 localhost:3000(http://localhost:3000/)의 브라우저에서 액세스할 수 있습니다. 그러나 ARG 명령을 사용하여 설정한 환경 변수에 액세스할 수 있는지 확인하는 것을 목표로 합니다.

이를 확인하려면 아래 명령을 사용하여 대화식 모드에서 컨테이너 파일 시스템에 액세스하십시오.

~/WebstormProjects/docker-env-variables$ docker exec -it docker-env-prod /bin/sh

출력:

/com/ecommerce #

현재 환경 변수를 표시하려면 아래 명령을 사용하고 ARG 명령어를 사용하여 설정한 두 변수가 표시되지 않음에 유의하십시오.

/com/ecommerce # printenv

출력:

NODE_VERSION=16.17.0
HOSTNAME=1bbf5ec4141e
YARN_VERSION=1.22.19
SHLVL=1
HOME=/root
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/com/ecommerce

ENV 명령을 사용하여 환경 변수 설정

Dockerfile의 이전 Docker 지침을 주석으로 만들고 주석 뒤에 다음 지침을 복사하여 파일에 붙여넣습니다.

FROM node:16.17.0-alpine
ENV APP_NAME=ecommerce-app
ENV APP_VERSION=1.0.0
RUN echo "build an image of ${APP_NAME} version ${APP_VERSION}"
WORKDIR /com/ecommerce
ADD package*.json ./
RUN npm install
COPY . .
CMD node index.js

Dockerfile의 지침은 이전 지침과 동일하며 변경 사항은 ARG 지침을 ENV 지침으로 바꾸는 것뿐입니다.

ENV는 Docker 빌더가 이미지를 생성하는 데 사용할 수 있는 환경 변수를 설정합니다. 환경 변수는 키-값 쌍의 형식입니다.

이러한 변수는 선택적이 아니며 선언된 각 값은 선택적 변수를 허용하는 이전 명령어와 비교한 값을 가져야 합니다.

이전 예제에서 컨테이너를 만들고 실행하는 방법을 설명했으므로 이 예제에서도 동일한 접근 방식을 사용하여 동일한 결과를 얻습니다. ENV 명령어를 사용하여 아래와 같이 두 가지 환경 변수 APP_NAMEAPP_VERSION에 액세스할 수 있습니다.

NODE_VERSION=16.17.0
HOSTNAME=0cca1ee1340d
YARN_VERSION=1.22.19
SHLVL=1
HOME=/root
APP_NAME=ecommerce-app
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/com/ecommerce
APP_VERSION=1.0.0

환경 변수를 동적으로 설정

명령줄에서 이미지를 빌드할 때 ARG 명령을 사용하여 ENV 명령을 사용하여 정의된 변수에 값을 동적으로 할당할 수 있습니다.

이를 실제로 보려면 Dockerfile의 이전 지침을 주석으로 만들고 다음 지침을 복사하여 파일에 붙여넣으십시오.

FROM node:16.17.0-alpine
ARG HOST_MACHINE
ENV APP_NAME=ecommerce-app
ENV APP_VERSION=1.0.0
ENV DEV_ENV=$HOST_MACHINE
RUN echo "build an image of ${APP_NAME} version ${APP_VERSION}"
WORKDIR /com/ecommerce
ADD package*.json ./
RUN npm install
COPY . .
CMD node index.js

변수 이름 $HOST_MACHINE을 참조하여 변수 이름 DEV_ENV가 있는 ENV 명령에 동적으로 할당되는 HOST_MACHINE 변수가 있는 ARG 명령어를 추가했습니다.

변수 이름 HOST_MACHINE에 대한 기본값을 생성할 수 있으며 이 값은 DEV_ENV 변수에 할당되거나 명령줄에서 --build-arg 명령을 사용하여 HOST_MACHINE에 값을 할당하고 동일한 결과를 얻을 것입니다.

결론

이 자습서에서는 환경 변수를 설정하는 방법과 실행 중인 컨테이너에서 이러한 변수에 액세스하는 방법을 배웠습니다. ARG 명령, ENV 명령을 사용하는 방법과 환경 변수를 동적으로 설정하는 방법을 배웠습니다.

여기에서 주목해야 할 주요 사항은 ARG 명령을 사용하여 설정한 환경 변수는 실행 중인 컨테이너에서 액세스할 수 없다는 것입니다.

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub

관련 문장 - Docker Environment Variable