Notice
Recent Posts
Recent Comments
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Día de Ruru

20230815 TIL Docker CI/CD 구축하기(2) 본문

TIL

20230815 TIL Docker CI/CD 구축하기(2)

공대루루 2023. 8. 21. 01:08

저번에 계속 빌드에서 터지던거 이제야 해결했다~~~ github actions 를 사용해서 이미지를 만들어서 그 이미지를 서버로 다운로드 받아서 사용했더니 제대로 동작했다!!

1. github actions 워크플로우 작성하기

github actions를 사용해서 이미지를 생성하고 그 이미지를 도커 허브로 올리는 과정까지를 워크플로우 작성해주었다.

name: build and deploy

# @@ main 브랜치에 푸시(push) 이벤트가 발생할 때마다 워크플로우가 실행
on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

# @@ deploy라는 이름의 작업(job)을 정의
jobs:
  build-and-deploy:

# @@ 작업이 실행될 운영 체제를 최신 버전의 Ubuntu로 설정
    runs-on: ubuntu-latest
    steps:
    # @@ actions/checkout@v3 액션을 사용하여 소스 코드를 체크아웃
    - name : checkout source code
      uses: actions/checkout@v3
        
    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v1

    - name: Login to DockerHub
      uses: docker/login-action@v1
      with:
        username: ${{ secrets.DOCKERHUB_USERNAME }}
        password: ${{ secrets.DOCKERHUB_PASSWORD }}

    - name: Build and push
      uses: docker/build-push-action@v2
      with:
        context: .
        push: true
        tags: ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKER_IMAGE_NAME }}:latest

만들어진 이미지는 도커 허브에서 확인할 수 있다.

2. EC2에서 도커 이미지 실행시키기

도커 허브에서 확인한 이미지는 서버 ec2에 pull 받아주어야 한다. 그 전에 서버에는 docker 와 docker compose가 설치되어 있어야 한다.
backend 이미지와 database 이미지 두개를 docker pull 이미지 이름 으로 다운로드 받아준 후 docker-compose 파일과 .env 파일도 생성해준다.
그 다음 docker compose up -d 로 컨테이너 올려주면 끝!!

✅ 문제 발생

docker compose up -d 로 컨테이너를 올려줬더니 아래와 같은 에러가 발생했다.

failed to solve: failed to read dockerfile: open /var/lib/docker/tmp/buildkit-mount3131520871/Dockerfile: no such file or directory

도커 이미지가 이미 빌드되어 있는데 dockerfile을 찾을 수 없다고 하는 것이 이상했다. 다시 찾아보니 docker compose 파일에서 사용할 이미지가 정의되어 있지 않아서 그런 것이었다. 아래와 같이 docker-compose 파일을 수정해준 후 다시 동작해보았더니 컨테이너도 잘 올라가고 동작도 잘 되었다!!!

version: '3'

services:
  backend:
    build: ./
    image: [pull 받은 도커 이미지 이름]
    container_name: nestjs_api
    env_file: ./.env
    environment:
      - TYPEORM_HOST=${TYPEORM_HOST}
      - TYPEORM_PORT=${TYPEORM_PORT}
      - TYPEORM_USERNAME=${TYPEORM_USERNAME}
      - TYPEORM_PASSWORD=${TYPEORM_PASSWORD}
      - TYPEORM_DATABASE=${TYPEORM_DATABASE}
      - AWS_ACCESS_KEY=${AWS_ACCESS_KEY}
      - AWS_SECRET_KEY=${AWS_SECRET_KEY}
      - AWS_BUCKET_NAME=${AWS_BUCKET_NAME}
      - SECRET_KEY=${SECRET_KEY}
    ports:
      - '3000:3000'
    depends_on:
      - database
    networks:
      - nestjs_network

  database:
    image: postgres:13
    container_name: postgres_db
    environment:
      POSTGRES_USER: ${TYPEORM_USERNAME}
      POSTGRES_PASSWORD: ${TYPEORM_PASSWORD}
      POSTGRES_DB: ${TYPEORM_DATABASE}
    ports:
      - '5432:5432'
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - nestjs_network
volumes:
  postgres_data:

networks:
  nestjs_network:
    driver: bridge

3. 쉘 스크립트 작성하기

도커를 실행시켜서 컨테이너 올리는 작업을 쭉 적어 둔 쉘 스크립트를 작성했다. 
일단 deploy가 시작되면 docker를 중지시키고 사용하지 않을 컨테이너와 이미지를 삭제했다. 컨테이너와 이미지를 삭제하는 과정의 시간이 오래걸려서 나중에 수정해야 할 것 같다. 

#!/bin/sh
echo "========>docker stop"

sudo docker stop $(sudo docker ps -aq)
sudo docker container prune -f

echo "========>docker image remove"
sudo docker rmi $(sudo docker images -q)

echo "========>docker login"
sudo docker login

echo "========>docker pull new image"
sudo docker pull [이미지 이름]

echo "========>docker up!!"
sudo docker compose up -d

쉘 스크립트를 실행했을 때 작성되어 있는 명령어가 하나 씩 실행되면 잘 동작하는 것이다. 쉘 스크립트가 잘 실행되고 있는지 확인하기 위해서 echo로 어떤 작업이 진행되고 있는지 표시를 해주었다. 아래 명령어를 입력하면 실행된다.

sh [파일이름]
sh deploy.sh

위의 명령어를 입력해서 쉘 스크립트가 잘 실행되는 것을 확인했다. 이제 이 쉘 스크립트를 내가 아니라 깃허브엑션이 실행하게 하면 된다!!

4. github actions  워크플로우 수정하기

이전까지 작성했던 워크플로우는 허브에 이미지를 올리는 것까지 동작한다. 

- name: ssh connect & start sh
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.HOST }}
        username: ubuntu
        password: ${{ secrets.PASSWORD }}
        port: 22
        script: |
          sudo sh deploy.sh

이전까지 작성된 부분에 위의 플로우를 추가해주었다. 내가 지정한 서버에 로그인을 한 후 script에 해당하는 동작을 실행하라는 뜻이다. 실행할 동작은 위에서 입력했던 쉘스크립트를 동작시키는 명령어이다.

워크플로우를 수정한 후 main에 푸시해서 actions가 에러없이 실행되는 것을 확인했다. 내 EC2에 접속해서 동작하는 도커 컨테이너를 확인해보았더니 정상적으로 컨테이너가 올라가고 작동하고 있었다.

끝!

'TIL' 카테고리의 다른 글

20240114 TIL  (0) 2024.01.14
20230812 TIL Docker CI/CD 구축하기(1)  (0) 2023.08.15
20230803 TIL 리눅스 명령어 정리  (0) 2023.08.04
Comments