Sandcorp샌드코프 · 웹·AI 제품 개발

새 프로젝트 받는 중 · 갱신 2026.11sandcorp.co.krGitHub

← 팁

배포·인프라

.env를 고쳤는데 컨테이너가 옛 값을 쓴다 — 환경변수는 컨테이너를 만들 때 한 번 읽힌다

docker compose restart는 같은 컨테이너를 다시 켤 뿐이라 바뀐 env_file을 읽지 않습니다. 값을 바꾼 뒤에는 그 값을 쓰는 서비스를 모두 다시 만듭니다.

운영 API 키를 새로 받아 서버의 .env에 넣고 docker compose restart web을 했습니다. 그런데 외부 API 호출은 여전히 옛 키로 나가 401이 납니다. 컨테이너 안에서 printenv를 해 보면 옛 값이 그대로 있습니다.

원인은 컨테이너의 환경변수가 컨테이너를 만들 때 정해진다는 데 있습니다. compose는 env_file과 environment를 읽어 컨테이너 설정에 박아 넣고, restart는 그 컨테이너를 멈췄다 다시 켤 뿐입니다. 파일을 다시 읽지 않습니다. 같은 .env를 쓰는 서비스가 여럿이면(웹, 배경 작업, 스케줄러) 하나만 다시 만들어도 나머지는 옛 값으로 계속 돕니다.

해법은 값을 쓰는 서비스를 모두 다시 만드는 것입니다. up -d는 설정이 바뀐 서비스를 새 컨테이너로 바꿉니다. 바뀐 것으로 잡히지 않을 때를 대비해 --force-recreate로 확실히 할 수 있습니다.

# 키를 쓰는 서비스를 모두 다시 만든다 (restart 아님)
docker compose up -d --force-recreate web worker scheduler

# 값은 출력하지 않고, 바뀌었는지만 길이로 확인한다
docker compose exec web sh -c 'printf %s "$API_KEY" | wc -c'

다시 만들 때 compose가 새 이미지를 받거나 빌드하지 않게 하려면 --no-build와 --pull never를 함께 줍니다. 같은 커밋으로 컨테이너만 다시 띄우는 일이라면, 배포 스크립트가 참조하는 이미지 이름표가 모두 로컬에 있는지도 먼저 확인합니다. 하나라도 빠지면 엉뚱한 단계에서 실패합니다.

문의 →