0. 들어가며
사실 이걸 거창하게 "트러블 슈팅"이라 쓰긴 했지만, 이번엔 정말 바보 같은 실수를 했습니다.
다시는 이런 실수를 반복하지 않기를 바라며 기록을 남겨봅니다..
한마디로 수주대토 같은 짓을 해버렸군요..
아래부턴 편한 어체로 작성해 보겠습니다.
※. 마지막에 요약 있습니다!
1. [기] 문제 인식
Front 코드에서 API를 호출하는 데 사용하는 URL을 환경 변수로 처리해 두었다.
그런데, 빌드한 후 웹 사이트에서 URL 경로를 계속 못 읽길래 환경 변수가 누락됐나? 하고 콘솔 로그를 찍어봤었다.
이런 식으로..
그랬더니 어머?
네.. undefined가 짜잔~
"undefined"
는 정말로 메모리상에 존재하지 않는 데이터란 겁니다.
네, 환경 변수가 제대로 읽히지 않았다는 이야기죠..
2. [승] 문제 탐색
일단 실행 중인 Frontend Docker container에 들어가서 빌드 폴더에 .env.local 파일이 제대로 있나 확인 해 봅니다.
있네요?
그래서 빌드까지 해 봤습니다.
제대로 인식이 되네요??
환경 변수가 제대로 동작하기까지 합니다.
이건 뭔가 이상한데,, 그럼 Jenkins 문제인가? 하고
도커 이미지가 처음 생성되는 Jenkins 빌드 콘솔을 뜯어봤습니다.
거기서 찾아낸 녀석이 바로~
네..
빌드는 성공했지만 환경설정 파일은 전혀 찾아내지 못한 로그를 찾았습니다.
3. [전] 왜 이런 문제가?
나는 Github Main 브랜치의 소스를 웹훅으로 Jenkins에 받아와 빌드하도록 설정해 두었고,
이후 Docker Compose를 통해 빌드 및 컨테이너를 실행하는 방식으로 CICD를 구축 해 둔 상태다.
자.. 당연히.
".env"같은 민감한 환경설정 파일들은 Github에 공개해선 안됩니다.
IP부터 뭐 비밀번호라던지 이런 숨기고자 하는 환경설정 파일인데,
이거를 AWS 호스트에 하드파일로 넣어놓고,
docker-compose.yml에서 volumes로 도커 컨텍스트 빌드 경로 내에 파일을 공유하도록 설정해 뒀었다.
volumes:
- /home/.env.local:/app/.env.local
이미 눈치 챈 사람도 있겠지만..
CICD 파이프라인 순서를 간략하게 나누어 보면,
1. Jenkins 빌드 시작
2. Dockerfile 기반 프로젝트 Build & Image
3. Docker Image 실행
이렇게 된다.
그런데 Docker-compose를 통해 volumes 데이터를 임포트 하는 건 3번 image 실행 단계에서 진행됩니다.
2번 단게인 Dockerfile 기반 Build를 할 때는 env 파일 자체가 없는 거죠..
역시 컴퓨터는 거짓말을 하지 않습니다ㅠ
4. [결] 해결 방법
Dockerfile 기반으로 빌드할 때는 외부 경로에서 파일을 복사해 올 수 없어요.
그래서 dockerfile에 COPY ./env .env 구문을 넣는 것과 같은 편법이 통하지 않습니다.
이 경우에는
Jenkinsfile에서 빌드 콘텍스트 내에 미리 외부 파일을 넣어둘 수 있답니다.
script {
sh 'cp /home/.env.local ./Front/.env.local'
sh 'docker-compose build frontend'
}
요런 식으로!
이렇게 설정하고 main push 후 로그를 찍어보니..
정상적으로 환경변수가 들어간 모습~
해결!
5. 마치며..
CICD 파이프라인은 정말 편리하고 유용하지만,
이런 세세한 설정에 신경을 쓰지 않으면 문제가 생길 수 있다는 점이 와닿았네요.
거기에 들어가는 세세한 세팅들에 대해 지금까지 너무 알아보지 않았던 게 아닌가?
조금 더 관심을 가지고 알아봐야 하지 않은가 라는 생각도 들고,
특히 민감한 설정 파일들을 어떻게 관리해야 하는지 더 깊이 고민해봐야겠다는 생각이 드네요.
그럼에도 불구하고, 해결될 때의 쾌감이 항상 즐거운 것 같습니다.
혹시라도 저처럼 같은 문제로 삽질하는 분이 없길 바라며
글을 마칩니다!
6. 요약
- 인식: 환경 변수를 읽지 못해 생긴 문제.
- 탐색: Docker 컨테이너에서는 문제없이 빌드되지만, Jenkins 빌드 시 .env.local 파일을 찾지 못함.
- 분석: Docker Compose의 volumes는 이미지 실행 시점에서만 적용되므로, 빌드 시에는 파일이 없었다는 것을 확인.
- 해결: Jenkins 빌드 시 파일을 미리 복사해두어 빌드 시점에서 사용할 수 있도록 설정하여 해결함.
'❗ 문제 해결 > Web' 카테고리의 다른 글
[👾Troubleshooting] 동적 배포와 정적 배포 문제 (REACT) (0) | 2024.09.30 |
---|