Día de Ruru
20230815 TIL Docker CI/CD 구축하기(2) 본문
저번에 계속 빌드에서 터지던거 이제야 해결했다~~~ 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 |