트러블슈팅 2. Caddyfile 을 고치고 reload 했는데 "config is unchanged" 가 나올 때
오사카 노드의 앞단 Caddy 에 사이트 블록을 하나 추가하던 중이었습니다. 저장소에서 고친 Caddyfile 을 노드로 올리고, 늘 하던 대로 install 로 제자리에 넣은 다음 reload 를 했습니다.
sudo install -m 644 /tmp/Caddyfile /opt/caddy/Caddyfile
docker compose exec caddy caddy reload --config /etc/caddy/Caddyfile
그런데 로그에는 이 한 줄뿐이었습니다.
{"level":"info","msg":"config is unchanged"}
호스트에서 cat 해 보면 분명 새 내용인데, 컨테이너 안에서 보면 옛 내용 그대로였습니다.
compose 파일을 보니 Caddyfile 을 이렇게 파일 하나만 마운트하고 있었습니다.
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
도커의 바인드 마운트는 마운트하는 순간의 파일(아이노드)을 붙잡습니다. install 이나 sed -i 는 기존 파일에 덮어쓰지 않고 새 파일을 만든 다음 이름을 바꿔 치우기 때문에, 호스트 쪽 이름은 새 파일을 가리키는데 컨테이너는 계속 지워진 옛 파일을 보게 됩니다. 저장할 때 새 파일로 바꿔 치우는 편집기도 마찬가지입니다.
방법은 두 가지였습니다.
내용만 덮어쓰면 같은 아이노드가 유지되니 컨테이너에도 바로 보입니다.
cat /tmp/Caddyfile | sudo tee /opt/caddy/Caddyfile > /dev/null
docker compose exec caddy caddy reload --config /etc/caddy/Caddyfile
이미 바꿔 치워 버렸다면 컨테이너를 재시작하면 마운트를 다시 잡습니다. 저는 그때 재시작으로 풀었습니다. 대신 앞단이라 그 몇 초 동안 노드의 모든 사이트가 끊깁니다.
그 뒤로는 Caddyfile 맨 위에 주석을 달아 두었습니다. 나중에 보는 사람이 저 자신이라도 같은 짓을 또 할 것 같아서요.
# 파일 하나만 바인드 마운트하므로 파일을 통째로 바꾸면(cp, install, sed -i) 컨테이너는 옛 파일을 계속 본다.
# 내용만 덮어쓰거나(cat 새파일 > Caddyfile), 바꾼 뒤 docker compose restart caddy 를 한다.
애초에 파일 대신 디렉터리를 마운트하면 이 문제가 없습니다. 다만 공식 이미지가 /etc/caddy/Caddyfile 을 기본으로 읽으니, 디렉터리로 바꾸려면 실행 명령도 같이 바꿔야 합니다.