이클립스에서 인텔리제이로 자바 개발 환경을 이전한 후,
이클립스에서 개발할 때는 환경별로 나누어놓은 application.yml 파일에 주요 정보들을 날 것? 그대로 입력해두고 개발 및 배포를 진행하고 있던 것을 인텔리제이를 통해 외부에서 환경변수를 주입할 수 있도록 변경하였고 순조롭게 개발을 진행한 후 배포를 하였는데 도커 컨테이너가
생성된 후 계속 죽는 현상이 발생 발생했습니다...🤒(도커가 아파요 ㅜㅜ)
또한, 배포된 사이트에서 로그인 시도시 502 BAD GATEWAY 에러가 발생 (137% 백엔드 사망 이슈)PS : application-*.yml 파일은 .gitIgnore를 통해 외부로 노출하지 않도록 하고있었음
도커 컨테이너가 죽었다? 할 일은 세가지 입니다.
1. docker ps -a를 통해 컨테이너가 죽어있는걸 확인한다.
2. 욕을 한다.
3. docker logs [containerName] 명령어를 통해 컨테이너가 죽은 이유를 파악한다.위 과정을 통해 log를 확인한 결과 아래와 같은 에러가 발생하고 있었습니다.
Failed to convert from type [java.lang.String] to type [java.lang.Integer] for value '${SERVER_PORT}'
그렇습니다.
문제는 application-prod.yml에 입력해둔 ${SERVER_PORT} 등의 환경변수를 찾지 못해서
컨테이너 생성 후 어플리케이션 기동시 죽어버리는 것이었습니다.
컨테이너 안에서 환경변수를 적용하기 위해서는 아래와 같은 방법이 있습니다.
또한 위 순서대로 환경변수가 적용되는 우선순위를 가집니다.
환경변수를 적용하는 방법은 위와 같이 다양합니다만,
저는
와 같은 이유로 docker-compose와 .env파일을 통해 환경변수를 주입할 수 있도록 했습니다.
결과
myapp.docker-compose.yml
services:
backend:
container_name: "my_app"
user: "myserver"
image: "my_app_prod"
ports:
- "8081:8081"
/* 중요 !!!*/
environment:
- SERVER_PORT=${SERVER_PORT]
.
..
...
....
- JWT_SECRET=${JWT_SECRET}
/* 중요 !!!*/
위와 같이 docker-compose의 원하는 서비스 항목에 환경변수를 등록합니다.
실제 작성시에는 당연히 본인이 기입한 환경변수를 정확히 입력해줘야 합니다.
정리하면
application-prod.yml에 기재된 값=${.env 파일에 기재된 KEY값}
와 같은 형식인거죠
2. .env 파일 생성 및 작성
SERVER_PORT=8081
JWT_SECRET=VELOG!3345!!$$GG%
등과 같이 작성해줍니다.
아래와 같이 이전에 도커 컴포즈를 실행하던 명령어에 --env-file .env[환경변수 파일명] 만 추가하면됩니다.
docker-compose --env-file .env -f myapp.docker-compose.yml up -d
저는 도커 컴포즈 파일 경로에 환경변수 파일이 함께 존재하고 있지만 그 경로가 다르다면
--env-file /home/myserver/..../.env
와 같이 환경변수 파일이 존재하는 정확한 경로를 기입해줘야합니다.
인텔리제이로 개발 환경을 이관하면서 생각보다 많은 것을 배우게 되었습니다.
이전에는 docker에 환경변수를 외부에서 주입해야하던 상황이 없었던터라 인텔리제이에서 빌드 후 배포한 후 컨테이너가 계속 죽었을때는 상당히 당황했습니다..ㅋㅋㅋ우여곡절이 많았지만 많은걸 경험할 수 있어서 뿌듯했네요