[Docker] docker-compose 파일에서 환경설정(.env file) 사용하기

by 스뎅(thDeng) on

docker-compose를 사용할 때 환경 마다 다른 설정값을 사용하고 싶을 때가 있다.

개발할 때 쉽게 사용할 환경으로 docker-compose를 사용해서 로컬에서 elasticsearch(ES)와 DB 등을 사용하고 있는데, ES가 메모리도 엄청 먹고 CPU도 계속 쓰는 것을 발견했다. docker-compose 파일을 수정해서 CPU와 메모리 사용을 제한하고 싶은데, 이 파일을 CI 서버에서도 사용하고 있어서 각 환경 마다 다른 설정을 쓸 수 있게 해야 했다.

이럴 때 사용할 수 있는 것이 .env파일.

.env파일에 아래처럼 설정값을 저장해 두고, docker-compose.yml파일에서는 ${ES_CPUS}처럼 사용하면 된다.

# .env 파일
# --env-file 옵션을 주지 않으면 자동으로 사용됨
ES_CPUS=1
ES_MEMORY=1G
version: '3.8'

services:
  elasticsearch:
    image: elasticsearch:7.9.3
    container_name: product_system_elasticsearch_7.9
    restart: always
    ports:
      - "9200:9200"
    environment:
      - "discovery.type=single-node"
    network_mode: bridge
    deploy:
      resources:
        limits:
          cpus: "${ES_CPUS}"
          memory: "${ES_MEMORY}"
  localstack:
    ..
  mysql:
    ..

config 옵션으로 적용될 설정을 확인해 볼 수 있다.

$ docker-compose config
services:
  elasticsearch:
    container_name: product_system_elasticsearch_7.9
    deploy:
      resources:
        limits:
          cpus: 1.0
          memory: 1G
    environment:
      discovery.type: single-node
    image: elasticsearch:7.9.3
    .. (생략) ..

다른 환경에서 사용할 .env 파일

각 환경에서 사용할 파일을 .env 파일 이외에 별도로 생성한다.

# .env.ci 파일
# --env-file 옵션으로 사용
ES_CPUS=2
ES_MEMORY=6G

--env-file 옵션으로 설정 파일을 지정할 수 있다. 역시 아래처럼 적용된 설정을 확인할 수 있다.

$ docker-compose --env-file .env.ci config
services:
  elasticsearch:
    container_name: product_system_elasticsearch_7.9
    deploy:
      resources:
        limits:
          cpus: 2.0
          memory: 6G
    environment:
      discovery.type: single-node
    image: elasticsearch:7.9.3
    .. (생략) ..

참고

별도로 명시하지 않을 경우, 이 블로그의 포스트는 다음 라이선스에 따라 사용할 수 있습니다: Creative Commons License CC Attribution-NonCommercial-ShareAlike 4.0 International License