[Project] .env파일로 도커 환경변수 관리하기 (with. ec2, Github action)

정동아·2024년 3월 6일

Celebee

목록 보기
11/12

이전글에서도 작성했지만 서버에서 사용하는 환경변수들을 .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을 사용하면서 이기회에 미뤄두었던 환경변수를 추가 설정해줬다.

  • 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

이런식으로 사용할 변수들을 작성해주고

  • .env
    여기서 사용할 값들을 저장해준다.
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

0개의 댓글