[파이썬] 도커 컨테이너와 호스트 간 환경 변수 공유

도커(Docker)는 가상화 기술을 사용하여 애플리케이션을 컨테이너화하여 배포하는 도구입니다. 도커 컨테이너는 애플리케이션과 해당 환경의 격리된 실행 환경을 제공하므로, 호스트와 분리된 환경에서 동작할 수 있습니다. 그러나 때로는 도커 컨테이너와 호스트 간에 환경 변수를 공유해야 하는 경우도 있습니다. 이번 블로그 포스트에서는 도커 컨테이너와 호스트 간에 환경 변수를 공유하는 방법을 알아보겠습니다.

도커 컨테이너 환경 변수

도커 컨테이너는 실행될 때 컨테이너 내부의 환경 변수를 설정합니다. 컨테이너 내부에서 애플리케이션을 실행하면서 해당 환경 변수를 사용할 수 있습니다. 컨테이너는 기본적으로 호스트의 환경 변수를 상속하지 않기 때문에, 별도로 환경 변수를 설정해주어야 합니다.

Dockerfile에서 환경 변수 설정

Dockerfile에서는 ENV 명령어를 사용하여 컨테이너 내부의 환경 변수를 설정할 수 있습니다. 예를 들어, 다음은 PORT 환경 변수를 5000으로 설정하는 Dockerfile의 예입니다.

FROM python:3.9

ENV PORT 5000

# 애플리케이션 실행과 관련된 내용은 생략합니다.

컨테이너 실행할 때 환경 변수 설정

컨테이너를 실행할 때에도 환경 변수를 설정할 수 있습니다. docker run 명령어의 -e 옵션을 사용하여 환경 변수를 지정할 수 있습니다. 예를 들어, 다음 명령어는 MY_VAR 환경 변수를 “hello”로 설정하면서 컨테이너를 실행합니다.

docker run -e MY_VAR=hello my_container

호스트와 컨테이너 환경 변수 공유

도커 컨테이너와 호스트 간에 환경 변수를 공유하기 위해서는 몇 가지 방법이 있습니다. 이러한 방법들 중에서는 각각의 장단점이 있으므로, 적절한 방법을 선택해야 합니다.

호스트 환경 변수 가져오기

도커 컨테이너는 기본적으로 호스트의 환경 변수를 상속하지 않습니다. 하지만 -e 옵션을 사용하여 docker run 명령어를 실행할 때, 호스트의 환경 변수를 도커 컨테이너로 전달할 수 있습니다. 예를 들어, 다음 명령어는 HOST_VAR 환경 변수를 호스트의 MY_VAR 환경 변수 값으로 설정하면서 컨테이너를 실행합니다.

docker run -e HOST_VAR=$MY_VAR my_container

파일을 통한 환경 변수 공유

또 다른 방법으로는 도커 컨테이너와 호스트 간에 파일을 공유하여 환경 변수를 설정하는 방법이 있습니다. 호스트에서 파일을 생성하고, 도커 컨테이너에서는 해당 파일을 읽어서 환경 변수를 설정합니다.

예를 들어, 다음은 호스트에서 env_file.txt 파일을 생성하고, 도커 컨테이너에서 해당 파일을 읽어서 환경 변수를 설정하는 예입니다.

# 호스트에서 env_file.txt 파일 생성
echo "MY_VAR=hello" > env_file.txt

# 도커 컨테이너에서 파일을 읽어서 환경 변수 설정
docker run --env-file env_file.txt my_container

이 방법은 더 복잡한 구성을 필요로 하지만, 보다 유연한 환경 변수 공유를 가능케 합니다.

파이썬에서 환경 변수 사용하기

파이썬에서는 os 모듈을 사용하여 환경 변수를 읽고 사용할 수 있습니다. 예를 들어, 다음은 파이썬 코드에서 환경 변수 PORT를 읽어서 사용하는 예입니다.

import os

port = os.environ.get('PORT')
if port:
    print(f"Port: {port}")
else:
    print("Port is not defined.")

위 예제에서 os.environ.get('PORT')는 환경 변수 PORT의 값을 가져옵니다. 가져온 값으로 로직을 처리하거나, 애플리케이션의 설정에 사용할 수 있습니다.

마무리

이번 블로그 포스트에서는 도커 컨테이너와 호스트 간에 환경 변수를 공유하는 방법을 알아보았습니다. 환경 변수를 공유하여 컨테이너와 호스트 간의 유연한 통신과 설정을 가능하게 함으로써, 도커 컨테이너의 활용도를 높일 수 있습니다. 적절한 방법을 선택하여 환경 변수 공유를 구현해보세요.