이번 글에서는 도커에서 환경변수를 설정해주는 방법에 대하여 정리해보려 한다!
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을 수정하지 않고도 유연한 방식으로 다른 이미지를 빌드할 수 있게 된 것입니다.
'DevOps > Docker' 카테고리의 다른 글
[Docker] 다중 컨테이너 구성 (0) | 2022.09.28 |
---|---|
[Docker] 컨테이너 통신 (0) | 2022.09.18 |
[Docker] Volumes과 Bind Mounts (0) | 2022.09.14 |
[Docker] 외부에서 컨테이너로, 컨테이너에서 외부로 파일 복사하기 (0) | 2022.09.07 |
[Docker] 도커의 Attached, Detached 컨테이너 (1) | 2022.09.07 |
댓글