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

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

← 팁

배포·인프라

compose command는 리스트로 쓰고, 실제 프로세스 인자로 확인한다

YAML 접힘(>)에서 더 들여 쓴 줄은 줄바꿈이 남아, sh -c가 첫 줄만 실행하고 옵션이 조용히 빠진다.

compose 파일에 --workers, --proxy-headers 같은 옵션을 넣었는데 운영 서버가 그 옵션 없이 떠 있다. 오류도 경고도 없다.

원인은 YAML 접힘 문법(>)이다. >는 줄바꿈을 공백으로 접어 주지만, 앞줄보다 더 들여 쓴 줄은 접지 않고 줄바꿈을 그대로 남긴다. 이 문자열이 sh -c로 넘어가면 셸은 줄바꿈을 명령 구분으로 읽어 첫 줄만 실행한다. 옵션 줄은 실행되지 않고, 서버는 기본값으로 뜬다.

# 위험: 더 들여 쓴 줄은 접히지 않아 옵션이 다른 명령이 된다
command: >
  sh -c "uvicorn app:app
      --workers 2 --proxy-headers"

# 안전: 인자를 리스트로
command: ["uvicorn", "app:app", "--workers", "2", "--proxy-headers"]

셸이 꼭 필요하면(마이그레이션 뒤 서버 시작 등) 한 줄로 쓰고 마지막 명령을 exec로 띄운다. 그래야 종료 신호가 셸이 아니라 앱에 바로 간다.

command: ["sh", "-c", "python manage.py migrate && exec uvicorn app:app --workers 2"]

조용히 빠지는 옵션은 오류를 내지 않으니, 배포 뒤에 실제 프로세스 인자를 한 번 확인한다.

docker exec app cat /proc/1/cmdline | tr '\0' ' '

문의 →