환경 변수를 활용하여 컨테이너를 간단하게 작성하고 관리하는 법을 알아봅니다.
컨테이너를 작성할 때 환경변수가 왜 중요한지 전달하고자 합니다. 분량 때문에 2개로 나누어서 진행하겠습니다.
⁃ 개발 , 테스트 , 운용 환경 모두 각각의 컨테이너가 생성되어야 하는지?
⁃ 컨테이너 기본 실행환경은 어떤 환경으로 실행되어야 하는지?
⁃ 컨테이너 실행 환경은 어떻게 설정하는가?이 글은 위 질문에 대한 답을 다음과 같이 정의 하고 설명합니다.
⁃ 모두 하나의 컨테이너를 활용하여 운영해야 한다.
⁃ 컨테이너 기본 실행환경은 개발환경을 기본으로 실행되어야 한다.
⁃ 여러 환경 변수 설정법을 알아본다.
내용에 대한 설명을 하기 전에 우선 가장 간단한 컨테이너를 작성해 보겠습니다. 단순한 “나는 컨테이너고, 실행 환경은 무엇이다.” 라는 내용을 출력하는 bash 스크립트를 만들어 보았습니다. 개발자가 아니어도 쉽게 이해할 수 있도록 최대한 간결하게 확인할 수 있는 방법을 택하였습니다.
$ cat run.sh
#!/bin/sh
while [ true ]; do
echo “I am container. env: test”
sleep 3
done
$ cat Dockerfile
FROM alpine
COPY run.sh /root/run.sh
RUN chmod +x /root/run.sh
CMD /root/run.sh
$ docker build -t blog .
$ docker run -it --rm blog
I am container. env: test
I am container. env: test
위 출력 화면의 변경을 위해 (= 실제 어플리케이션의 동작 차이점) 개발, 테스트, 운용 환경 모두 다른 컨테이너를 만들었다고 가정해 보겠습니다. 환경별 컨테이너를 만들기 위해 소스 코드 변경이 3번 필요하고 컨테이너 작성도 3번이 필요할 것입니다.
컨테이너 작성 과정에서 발생할 수 있는 문제들은 다음과 같습니다.
⁃ 각 환경별 코드 변경 이후 컨테이너를 만든다면 각 컨테이너별 동작을 별도로 확인하는 것이 맞다.
⁃ 컨테이너 생성의 시기가 달라진다면 내부 내용이 달라질 수 있는 경우도 있다.
⁃ 각 환경별 별도의 소스 변경을 작업한다면 소스 변경 중 사람의 실수가 발생할 수 있는 부분이 있다.
따라서 코드를 3번 변경하고 컨테이너를 3번 만드는 것이 아니라 아래처럼 수정을 한다면 하나의 컨테이너로 모든 환경을 실행 할 수 있도록 하였습니다.
$ cat run.sh
#!/bin/sh
while [ true ]; do
echo "I am container. env: ${ENV}"
sleep 3
done
$ docker build -t blog .
$ docker run -it --rm -e ENV=test blog
I am container. env: test
I am container. env: test
$ docker run -it --rm -e ENV=stage blog
I am container. env: stage
I am container. env: stage
$ docker run -it --rm -e ENV=prod blog
I am container. env: prod
I am container. env: prod
이와 같이 우리는 하나의 컨테이너로 충분히 3가지 환경 모두 적용하여 사용할 수 있음을 확인하였습니다. 그러나 너무 간단한 예시만 들었다고 생각할 수 있습니다.
⁃ 여러개의 변수가 필요한 경우는 불편할 것이다.
⁃ 예시로 활용한 어플리케이션은 너무 간단하다.
어디까지나 빠르고 쉬운 이해를 위해서 아주 간단한 예시를 들었을 뿐, 실제 동작에 필요한 환경 변수를 정의 하는 것은 여러가지 방법이 있을 수 있습니다. 그것에 대한 방법은 어플리케이션 작성시 고민이 필요한 부분입니다.
핵심은 어플리케이션 동작에 반드시 필요한 다음의 내용들은 환경 변수로 정의 하는 것이 필요하다는 것입니다. (아래는 예시 중 일부)
⁃ Database 접속을 위한 환경 설정 내역
⁃ 공용 폴더 (이미지, 알고리즘 모델 등...) 접속 경로
⁃ 각종 서비스 요청 주소
⁃ 로그 파일 저장 위치 혹은 방법이제 환경 변수를 전달 할 수 있는 방법을 정리해 보겠습니다.
⁃ docker 실행 명령으로 전달
⁃ docker file에 명시
⁃ docoker compose에 직접 입력
⁃ docker compose에 환경 변수로 반영
⁃ 여러 .env 파일을 나눠서 사용첫 번째인 docker 실행 명령으로 전달하는 방법은 이미 위에서 설명했습니다. 공식 문서는 다음의 내용을 참고 하시면 됩니다. docker run
만약 실수로 환경 변수를 지정하지 않고 실행한다면 어떻게 될까요? 환경 변수 없이 실행된다면 어플리케이션에 따라서는 바로 비정상 종료되는 경우가 많을 것입니다. (바로 비정상 종료가 되는 것이 더 안전합니다. 실행 중 종료되는 것이 더 문제를 찾는데 어려움이 생길 수 있기 때문입니다.)
$ docker run -it --rm blog
I am container. env:
I am container. env:
그렇다면 실행 시 환경 변수 설정을 하지 않더라도 실행 변수를 지정할 수 있는 방법은 없을까요? 답은 바로 Dockerfile 을 작성할 때 기본값을 설정하는 것입니다. environment-replacement
$ cat Dockerfile
FROM alpine
ENV ENV=test
COPY run.sh /root/run.sh
RUN chmod +x /root/run.sh
CMD /root/run.sh
$ docker run -it --rm blog
I am container. env: test
I am container. env: test
이렇게 Dockerfile 을 작성할 때부터 반드시 필요한 환경 변수를 지정한다면 실행을 위한 기본 값을 매번 지정하지 않아도 됩니다.
우리는 왜 컨테이너 작성 시 환경 변수가 필요하고, 환경 변수를 활용하였을 때 하나의 컨테이너로 운용할 수 있는지 확인해 보았습니다. 아래의 내용은 다음 글에서 다루어보겠습니다.
⁃ 컨테이너 기본 실행환경은 반드시 어떤 환경으로 실행되어야 하는지?
⁃ 컨테이너 실행 환경은 전달 방법은 어떤 것들이 있는지? (남은 것들)