이전글에서도 작성했지만 서버에서 사용하는 환경변수들을 .env 파일에서 관리해주고 싶었으나, 깃헙에 안올라갈테고 나는 github action을 사용해서 CD 해주고 있는데 어떻게 그 변수가 전달되는거지..? 하는 생각을 했다.
나처럼 생각하는 취준생이 분명히 있을거같아 글을 쓴다..!
현재 나는 github action을 통해 도커 이미지로 서버 파일을 빌드해서 Ec2에 도커 이미지를 실행시켜 서버를 배포하고있다.
서버파일에서 사용하는 환경변수들을 docker run -e 이렇게 옵션을 주어서 git secrets 에 저장된 값으로 주고 있었다.
'sudo docker run -d --name server -p 8080:8080 \
-e AWS_ACCESS_KEY=${{secrets.DEV_AWS_ACCESS_KEY}} \
-e AWS_SECRET_ACCESS_KEY=${{secrets.DEV_AWS_SECRET_ACCESS_KEY}} \
-e DOCKER_HUB_PASSWORD=${{secrets.DOCKER_HUB_PASSWORD}} \
-e DOCKER_HUB_USERNAME=${{secrets.DOCKER_HUB_USERNAME}} \
-e JWT_SECRET_KEY=${{secrets.JWT_SECRET_KEY}} \
-e MYSQL_DATABASE_PASSWORD=${{secrets.MYSQL_DATABASE_PASSWORD}} \
-e MYSQL_DATABASE_URL=${{secrets.MYSQL_DATABASE_URL}} \
-e MYSQL_DATABASE_USERNAME=${{secrets.MYSQL_DATABASE_USERNAME}} \
-e KAKAO_CLIENT_ID=${{secrets.KAKAO_CLIENT_ID}} \
-e KAKAO_CLIENT_SECRET=${{secrets.KAKAO_CLIENT_SECRET}} \
-e MAIL_USERNAME=${{secrets.MAIL_USERNAME}} \
-e MAIL_PASSWORD=${{secrets.MAIL_PASSWORD}} \
이렇게.
값이 많아질 수록 배포하며 환경변수때문에 실수도 많았고 오타 하나하나 찾는게 너무 힘들었다.
또한, 멘토님이 현업에서 사용하지 않는 방법이라고 했다. 현업에서는 .env 파일로 사용하는 변수들을 관리한다고 했다.
난 서버 하나만 관리하는데도 실수가 있는데, 서버를 몇십개 관리하고 도커 이미지도 그만큼 사용한다면 배포할때마다 이렇게 설정해주기엔 정말 비효율적일거같다는 생각이 들었다.
도커 로그 관리를 위해 docker-compose.yml을 사용하면서 이기회에 미뤄두었던 환경변수를 추가 설정해줬다.
version: '3'
services:
web:
build:
context: .
dockerfile: ./Dockerfile
container_name: server
image: "${DOCKER_HUB_USERNAME}/celebee-server:v3"
ports:
- 8080:8080
environment:
- AWS_ACCESS_KEY=${AWS_ACCESS_KEY}
- AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
- DOCKER_HUB_PASSWORD=${DOCKER_HUB_PASSWORD}
- DOCKER_HUB_USERNAME=${DOCKER_HUB_USERNAME}
- JWT_SECRET_KEY=${JWT_SECRET_KEY}
- MYSQL_DATABASE_PASSWORD=${MYSQL_DATABASE_PASSWORD}
- MYSQL_DATABASE_URL=${MYSQL_DATABASE_URL}
- MYSQL_DATABASE_USERNAME=${MYSQL_DATABASE_USERNAME}
- KAKAO_CLIENT_ID=${KAKAO_CLIENT_ID}
- KAKAO_CLIENT_SECRET=${KAKAO_CLIENT_SECRET}
- MAIL_USERNAME=${MAIL_USERNAME}
- MAIL_PASSWORD=${MAIL_PASSWORD}
volumes:
- server-log:/celebee/log
volumes:
server-log:
external: true
이런식으로 사용할 변수들을 작성해주고
AWS_ACCESS_KEY=1234
AWS_SECRET_ACCESS_KEY=1234
DOCKER_HUB_PASSWORD=1111
DOCKER_HUB_USERNAME=11111111
이런식으로 각 값들을 작성하면된다.
따로 설정을 안해도 .env파일은 자동으로 사용한다.
만약 컨테이너별로 다른 환경변수 값 적용이 필요하다면,
docker-compose --env-file .env.dev
이렇게 --env-file로 옵션을 주어서 사용할 환경변수 파일을 설정해줄 수 있다.
변경전 변수들을 다 옵션으로 줘서 길었던 명령어가
sudo docker-compose -f ./docker-compose.yml up -d
이렇게 간단해졌고, 나중에 환경변수 값이 변경되어도 수정하고 관리하기 훨씬 용이해졌다.
docker-compose.yml과 .env 파일의 위치를 서버 프로젝트의 루트경로에 있어야한다고 생각했는데, 내가 이 서버를 돌릴 위치. 그니까 나의 경우에는 ec2에 올려두면 됐었다.
ec2의 /home/ubuntu/ 경로에 두 파일을 위치시켜서 해결했다.
좀만 더 생각해보면 도커 이미지를 실행시키는건데 왜 프로젝트 내에 그 파일들을 넣으려했을까..? 싶다. (100% 맞는 방법이라는 확신은 없다.. 틀렸으면 꼭 알려주시길 부탁드립니닷..)
그 파일들을 어떻게 ec2로 보내지..?
이전에 수동으로 ec2에서 서버를 배포할 때 scp -i 로 파일을 보냈어서 이렇게 로컬에서 작성하고 올려야하나..? 했는데, .env 파일은 어떻게 보내지...? 하다가 아, ec2에서 파일 생성하면 되잖아;; 이랬다 ㅋㅋ...
아직 CLI가 완벽하게 익숙하지 않아서 그런가싶다..
CLI 명령어를 더 많이, 좀 더 숙지할 수 있도록 많이 써봐야겠다 생각해서 프로그래밍 공부 목록에 추가시켰다,,^^
reference
https://blog.leocat.kr/notes/2021/05/15/docker-use-env-file