설정을 고쳤는데 값이 안 바뀌었고 어디서 온 값인지 찾는 데 반나절이 걸렸다. 층이 여섯이었고 뒤로 갈수록 앞을 덮는 구조였는데 내가 고친 층 뒤에 같은 키가 또 있었다.
Table of contents
Open Table of contents
층별로 읽어 비교하기
값만 찍어서는 어디서 왔는지가 안 나왔다. 그래서 각 층을 따로 읽어 한 줄에 나란히 찍게 했다.
기본값과 설정 파일과 환경 파일과 환경 변수의 값을 함께 출력하니 환경 변수 쪽이 다른 값을 갖고 그것이 이기고 있다는 것이 바로 보였다. 값 하나만 보면 결과는 알아도 출처는 모르므로 층별로 나란히 찍는 것이 진단의 시작이었다.
아래에서부터 보는 순서
층을 그림으로 그려 무엇이 무엇을 덮는지를 정리했다. 코드 기본값에서 시작해 설정 파일과 환경 파일과 컨테이너 환경 변수와 배포 도구 주입과 실행 인자 순으로 이긴다.
그림을 그리고 나니 위에서부터 훑는 대신 아래에서부터 보게 됐다. 이기는 것을 먼저 보는 쪽이 훨씬 빨랐다.
층마다 무엇을 둘지 정하기
각 층에 무엇을 둘지를 정하니 겹치는 것이 줄었다. 코드 기본값에는 없어도 도는 안전한 값을 두고 설정 파일에는 구조와 기본 설정을 두며 환경 파일에는 개발자별 값을 둔다.
운영 값은 컨테이너 환경으로 주입하고 실행 인자는 일회성 수동 실행에만 쓴다. 비밀 값은 환경 파일과 컨테이너 환경에만 두고 코드와 설정 파일에는 넣지 않기로 했다.
겹친 키를 빼기
두 층에 다 있는 키를 뽑아 세 개를 찾았다. 뒤쪽이 이기므로 앞쪽 값은 아무 의미가 없는 상태였다.
앞쪽에서 그 키들을 뺐는데 겹쳐 있으면 헷갈리기만 하기 때문이다. 운영에서는 환경 파일 자체를 안 쓰기로 해서 층이 하나 줄었고 층은 유연한 만큼 찾기 어려워지므로 필요한 만큼만 두는 것이 맞았다.
안에서 본 실제 값
밖에서 무엇을 주었는지와 컨테이너 안에서 무엇이 보이는지가 달랐다. 밖에서 준 값과 안에서 조회한 값이 서로 달랐던 것이다.
이미지 자체에 같은 이름의 환경 변수가 박혀 있었고 그것이 나중에 읽혀 이기고 있었다. 시험용으로 넣고 안 지운 것이었으며 밖에서 준 것이 항상 이기는 것이 아니므로 안에서 실제 값을 봐야 알 수 있었다.
정리
- 설정이 여러 층이면 어느 층에서 온 값인지부터 찾는다
- 각 층을 따로 읽어 나란히 찍어 비교한다
- 층을 그림으로 그리고 이기는 쪽부터 본다
- 각 층에 무엇을 둘지 정하면 겹침이 준다
- 두 층에 다 있는 키를 찾아 하나를 뺀다
- 지금 값을 볼 수 있게 하되 비밀 값은 가린다
- 층은 유연한 만큼 찾기 어려우므로 줄일 수 있으면 줄인다
- 밖에서 준 것이 항상 이기지 않으므로 안에서 확인한다