DevOps/Docker

[Docker] 도커의 환경변수 설정

샤아이인 2022. 9. 15.

 

이번 글에서는 도커에서 환경변수를 설정해주는 방법에 대하여 정리해보려 한다!

 

1. 환경변수

도커는 build-time 인수runtime 환경변수를 지원합니다.

 

1 - 1) 환경변수

환경변수는 Dockerfile 안에서 사용할 수가 있습니다.

Dockerfile 내부의 'ENV' 옵션을 통해서 우선 환경변수를 선언한 후, 이후 "docker run"을 실행할 때 "--env"옵션 또는"--env-file"을 통해서 변수에 값을 설정할 수 있습니다.

 

다음과 같은 server.js 파일이 있다고 해봅시다.

도커 내부에서의 port번호를 조금 더 유동적으로 지정하고 싶은 상황입니다.

 

▶ server.js

// 생략...

app.listen(process.env.PORT);

위 파일을 그냥 사용하면 작동하지 않을 것입니다. 아직 PORT환경변수에 값을 설정하지 않았기 때문이죠!

 

따라서 Dockerfile 내부에서 다음과 같이 값을 설정해봅시다!

▶ Dockerfile

FROM node:14

WORKDIR /app

COPY package.json .

RUN npm install

COPY . . 

ENV PORT 80

EXPOSE $PORT

CMD ["npm", "start"]

"ENV PORT 80"을 통해 PORT라는 환경변수에 80을 할당합니다.

또한 EXPOSE에도 "$PORT"를 통해 동적으로 노출할 포트를 명시하게 됩니다.

기존의 EXPOSE 80에 비하면 상당한 발전이라 할 수 있죠!

 

다음 docker run을 통해 이미지를 인스턴스화 시켜봅시다!

docker run -d -p 3000:80 --name feedback-app 
-v feedback:/app/feedback 
-v /Users/shine/study/docker-study:/app:ro 
-v /app/temp  
-v /app/node_modules 
feedback-node:env

위와 같이 실행하면 우리가 Dockerfile에 지정한 80 포트를 통해 수행하게 됩니다.

default로 PORT에는 80이 담기는 것 이죠!

 

물론 다음과 같이 실행 시점에 포트를 변경할 수도 있습니다!

docker run -d -p 3000:8000 
--env PORT=8000 // 이부분 주목!!!
--name feedback-app 
-v feedback:/app/feedback 
-v /Users/shine/study/docker-study:/app:ro 
-v /app/temp  
-v /app/node_modules 
feedback-node:env

"--env"옵션으로 PORT에 8000번을 할당합시다! 

또 주의할 점이 있는데, -p 3000:8000과 같이 컨테이너 내부의 포트 또한 함께 변경해줘야 합니다.

 

마지막으로는 환경변수 파일을 이용해봅시다. 다음과 같이 .env 파일을 만들어서 사용해봅시다.

 

▶ .env

PORT=8000

 

해당 파일을 사용하도록 실행 시 추가해주면 됩니다.

docker run -d -p 3000:8000 
--env-file ./.env // 이부분 주목!!!
--name feedback-app 
-v feedback:/app/feedback 
-v /Users/shine/study/docker-study:/app:ro 
-v /app/temp  
-v /app/node_modules 
feedback-node:env

현재 디렉터리 내부의 .env 파일을 지정하였습니다.

 

1 - 2) Build 인수 (ARG)

인수의 경우 Dockerfile을 통해 'docker build'를 실행할 때 '--build-arg' 옵션으로 인수를 전달하는 방식입니다.

이 방식은 이미지를 build 할 때 다른 값을 추가할 수 있습니다.

 

그럼 이전 runtime 환경변수와 뭐가 다른 것일까요?

이전 환경변수는 빌드된 이미지를 인스턴스화 시켜 컨테이너를 생성할 때 환경변수를 설정한 것입니다.

ARG 방식은 이미지를 빌드할 때 전달하는 방식입니다.

 

예를 들어 우리의 Dockerfile을 잠시 살펴봅시다.

FROM node:14

WORKDIR /app

COPY package.json .

RUN npm install

COPY . . 

ENV PORT 80

EXPOSE $PORT

CMD ["npm", "start"]

위 코드에서는 PORT의 기본값이 80으로 정해져 있습니다.

만약 이 기본값까지 유동적으로 적용하고 싶다면 어떻게 해야 할까요?

 

이럴 때 Build-time(ARG) 인수를 사용하면 됩니다.

동일한 Dockerfile 하나를 통해서 이미지를 Build 할 때마다 여러 default값을 설정할 수 있습니다.

 

기존의 Dockerfile을 다음과 같이 수정해봅시다!

FROM node:14

ARG DEFAULT_PORT=80 // ARG 추가!!!

WORKDIR /app

COPY package.json .

RUN npm install

COPY . . 

ENV PORT $DEFAULT_PORT

EXPOSE $PORT

CMD ["npm", "start"]

우리의 이미지는 "ARG DEFUALT_PORT=80"으로 설정된 80번 포트를 기본으로 사용하게 됩니다.

하지만 이미지를 build 할 때 이를 동적으로 변경해줄 수 있습니다.

 

이미지 build시 다음과 같이 "--build-arg"를 통해서 값을 설정할 수 있습니다.

이렇게 이미지를 build할때 특정 값을 잠글 수 있고, Dockerfile을 매번 수정하지 않아도 유연하게 포트를 지정할 수 있죠!

 

즉, Dockerfile을 수정하지 않고도 유연한 방식으로 다른 이미지를 빌드할 수 있게 된 것입니다.

댓글