EC2에 도커를 띄우고 이제 그 관리를 script를 만들어서 하려고 했으나,
동갑내기 사원님이 테스트 프로젝트로 github actions에 성공했다고 해서 부랴부랴 지금 프로젝트에 세팅을 하였다.
(액션을 세팅하는 부분은 추후에 정리하여 포스팅할 예정...!)
💡 CI/CD (Continuous Integration/Continuous Delivery)
CI: 빌드 / 테스트 자동화 과정 (지속적인 통합)
CD: 배포 자동화 과정(지속적인 배포)
세팅까지 끝내고, back-deploy test push 를 해보는데 초록불 두둥!!!
모야 간단하네!!!! 라고 생각하고 사이트를 접속해 보는데 정상적으로 작동!!
그래서 한번 더 테스트 해 볼겸 스웨거를 업데이트 하고 다시 돌려보는데 스웨거가 업데이트가 되지 않았다.
이상해서 EC2 들어가서 현재 실행중이 도커 컨테이너를 확인해보는데 2개가 돌아가고 있었다.
알고보니까 이전 도커 컨테이너로 잡혀있어서 사이트가 잘되는 것처럼 보였던 것....
그래서 이전 컨테이너를 삭제하고 다시 해보는데 서버가 안켜짐
그래서 로그를 확인해보는데..
DB 정보가 없어서 서버가 켜지지 않는 것..
생각해보니 현재 컨테이너 내부에는 .env 파일이 존재하지 않는다.
일단 .gitignore 때문에 .env 파일이 깃허브에 올라가지 않았고,
그렇기 때문에 도커 허브에도 .env 파일이 없다.
그렇기 때문에 당연히 환경 변수에 대한 파일이 없기 때문에 실행이 안된다.
그래서 처음 시도했던 건
도커 컨테이너를 build 하는 과정에서 .env 파일을 넣어주려고 actions 파일에 .env 파일을 만들어주는 과정을 추가했다.
jobs:
# 빌드 Job
build:
name: Build
runs-on: ubuntu-latest
steps:
# github repository에서 checkout
- name: Checkout
uses: actions/checkout@v2
- name: Generate Environment Variables File for Production
run: |
echo "MONGO_URI=${{ secrets.MONGO_URI }}" >> backend/.env
echo "NODE_ENV=${{ secrets.NODE_ENV_PRD }}" >> backend/.env
echo "MONGO_URI=${{ secrets.MONGO_URI }}" >> backend/.env.dev
echo "NODE_ENV=${{ secrets.NODE_ENV_DEV }}" >> backend/.env.dev
결과는 실패...
다음 두번째로
deploy 하는 과정에서 .env 파일 만들기
deploy:
needs: build # build 후에 실행되도록 정의
name: Deploy
runs-on: [ self-hosted, label-go ] # AWS ./configure에서 사용할 label명
steps:
- name: Login to no1recipe
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USER }}
password: ${{ secrets.DOCKER_PWD }}
- name: make .env
run: |
echo "MONGO_URI={{ secrets.MONGO_URI }}" >> .env
- name: Docker run
run: |
docker stop ${{ env.NAME }} && docker rm ${{ env.NAME }} && docker rmi ${{ env.DOCKER_IMAGE }}:0.0.1
docker run -d -p 80:3666 --name ${{ env.NAME }} --restart always ${{ env.DOCKER_IMAGE }}:0.0.1
또 실패....
세번째로 docker run 시킬 때 -e 옵션을 주어 env 변수를 전달하는 방식으로 접근했는데
deploy:
needs: build # build 후에 실행되도록 정의
name: Deploy
runs-on: [ self-hosted, label-go ] # AWS ./configure에서 사용할 label명
steps:
- name: Login to no1recipe
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USER }}
password: ${{ secrets.DOCKER_PWD }}
- name: Docker run
run: |
docker stop ${{ env.NAME }} && docker rm ${{ env.NAME }} && docker rmi ${{ env.DOCKER_IMAGE }}:0.0.1
docker run -e MONGO_URI=${{ env.MONGO_URI }} -d -p 80:3666 --name ${{ env.NAME }} --restart always ${{ env.DOCKER_IMAGE }}:0.0.1
이것도 실패........
이러한 방법으로 둘이서 엄청 로그를 쌓아나갔다ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ
진짜 하다가 하다가 안되서 친구에게 의견을 구했다.
이 안에서 파일을 생성하는게 안되면 도커 이미지에 파일이나 변수를 전달하는 방식으로 접근해보라고..
그래서 그렇게 접근해 보기로 했다.
찾아보니까 로컬에 있는 파일을 도커 컨테이너 안에 복사할 수 있었다.
그래서 EC2에 있는 .env 파일을 도커 컨테이너에 복사
docker cp ~/forYourRecipe/backend/.env ${{ env.NAME }}:/app
여기서도 많이 엄청 많이 헤맸다...
1. 로컬이라고 해서 현재 내 PC 기준인줄 알았는데 도커가 실행되는 EC2 기준이여서 파일의 경로를 수정했고,
2. 복사 해주는 부분에서 계속 컨테이너를 찾지 못하기에 저 스크립트를 docker run 구문 다음 줄에 실행되도록 옮겼고,
3. 파일 저장 위치를 잘못 잡아줬던 문제점이 있었다.
# 첫번째 시도
# 저장할 파일명을 선언해주는건줄 알았다....
docker cp ~/forYourRecipe/backend/.env ${{ env.NAME }}:/.env
# 두번째 시도
# 우리 프로젝트 루트 디렉토리를 backend 로 잡아놔서 그 디렉토리 경로까지 다 써줘야하는줄 알았다.
docker cp ~/forYourRecipe/backend/.env ${{ env.NAME }}:/backend/.env
# 세번째 시도
# 파일명은 빼고 저장시킬 경로만 지정해주면 된다고 해서 디렉토리명으로 수정했다.
docker cp ~/forYourRecipe/backend/.env ${{ env.NAME }}:/backend
근데 저 방법 다 실패...
이상해서 도커 컨테이너에 들어가보기로 했다.
컨테이너에 접근하는 방법
docker exec -it 컨테이너id /bin/bash
# bash를 지원하지 않을 경우
docker exec -it 컨테이너id /bin/sh
나의 경우는 bash가 안되서 sh로 접속해보았는데
루트 경로가 app 이네....?????
그렇다면 당연히 backend 디렉토리도 없고... 이상한 곳에 파일이 복사되고 있던 거니까 경로를 app으로 바꿔줬더니
docker cp ~/forYourRecipe/backend/.env ${{ env.NAME }}:/app
DB 연결 완료
81번 만에 성공...😭 😭 😭 😭 😭
이렇게 프론트, 백 CI / CD 완성
이제 DB 초기화 하고 제대로된 레시피 만 등록해준다면 1차 목표는 여기서 끝이다
'개발노트 > Note' 카테고리의 다른 글
No.1Reciepe - 서버 다운.. (3) | 2023.03.23 |
---|---|
사이드 프로젝트 - forYourRecipe (No1. Recipe) - Docker Build (0) | 2023.03.07 |
사이드 프로젝트 - forYourRecipe (No1. Recipe) - vue 3 (0) | 2023.03.06 |
사이드 프로젝트 - forYourRecipe (No.1 Recipe) - 프로젝트 계획 (0) | 2023.03.05 |
사이드 프로젝트 - forYourRecipe - 시작 (0) | 2023.02.16 |