turin.blog
← 전체 글로 돌아가기

practical debugging note

Docker Compose에서 env_file을 바꿨는데 값이 그대로였던 실수

env_file을 수정한 뒤 컨테이너 내부 값이 바뀌지 않아 compose 설정 확인과 재생성 기준을 다시 잡은 기록입니다.

빠른 요약

겉으로는 재시작했는데 값은 그대로였다 환경변수 하나를 바꾸고 docker compose restart를 실행했다.

이 글에서 확인할 것
  • 겉으로는 재시작했는데 값은 그대로였다
  • 설정이 실제로 어떻게 들어가는지 보기
  • 적용할 때 쓴 명령어
  • restart와 up을 구분하기
  • 다음 배포부터 넣은 확인

겉으로는 재시작했는데 값은 그대로였다

환경변수 하나를 바꾸고 docker compose restart를 실행했다. 그런데 앱 안에서는 예전 값이 계속 찍혔다. 파일을 잘못 저장했나 싶어서 몇 번을 열어봤지만 .env.production에는 새 값이 들어 있었다.

내가 놓친 부분은 restart가 컨테이너를 새로 만들지 않는다는 점이었다. 이미 만들어진 컨테이너의 환경변수는 파일을 고쳐도 자동으로 다시 읽히지 않았다.

설정이 실제로 어떻게 들어가는지 보기

먼저 Compose가 읽은 최종 설정을 확인했다.

docker compose --env-file .env.production config

여기서 값이 맞으면 파일 파싱 문제는 아니라고 볼 수 있다. 그 다음 실행 중인 컨테이너 안의 환경변수를 확인했다.

docker compose exec web printenv | sort | grep APP_

두 결과가 다르면 컨테이너 재생성이 필요한 상태다.

적용할 때 쓴 명령어

나는 운영에서는 아래처럼 서비스만 지정해서 다시 만들었다.

docker compose --env-file .env.production up -d --force-recreate web

이미지도 같이 바뀐 배포라면 pull 또는 build 단계가 앞에 있어야 한다.

docker compose --env-file .env.production pull web
docker compose --env-file .env.production up -d --force-recreate web

restart와 up을 구분하기

내 기준은 이렇게 잡았다.

  • 프로세스만 다시 띄우면 되는 경우: restart
  • 환경변수, 볼륨, 포트, 이미지 태그가 바뀐 경우: up -d
  • 정말 같은 설정으로 다시 만들고 싶은 경우: --force-recreate

다음 배포부터 넣은 확인

배포 스크립트 마지막에 버전과 환경 이름만 짧게 찍도록 했다. 비밀값은 절대 출력하지 않고, 현재 컨테이너가 어느 설정 묶음으로 떴는지만 확인한다.

docker compose exec web node -e "console.log(process.env.APP_ENV)"

결론 대신 적어둔 문장

.env 파일을 고쳤다는 사실과 컨테이너가 그 값을 들고 있다는 사실은 다르다. Compose를 쓸 때는 최종 config와 컨테이너 내부 값을 따로 확인해야 덜 헤맨다.