[Github Action] 기존 Docker 컨테이너 삭제 안 되는 문제 해결

2-pi-r·2025년 8월 10일
0

팀 개발 환경

  • Github Action
    • CI/CD 구축 (Github의 develop 브랜치에 커밋이 되면 → AWS EC2에 자동 배포되도록)

(자세한 건 이전 게시물 참고)

문제

Github Action에서 build에 실패했다. (전에는 잘 됐고, 이번에만 갑자기 실패)

원인, 해결 방법

deploy.yml(workflow file)를 확인하니,
지금은 develop 브랜치에 커밋되면 deploy.sh에서
docker-compose로 컨테이너를 빌드해서 실행하고 있다.
이때 같은 이름의 컨테이너가 있으면 안 돼서, 새 컨테이너 실행 전에 기존 컨테이너를 삭제한다.

문제는 deploy.sh에서 compose로 생성한 컨테이너만 삭제하고 있었다는 거다. 팀원이 어제 배포하고 ec2에서 문제 해결하면서 cli에서 docker run으로 컨테이너를 직접 생성했는지, 그 컨테이너는 삭제가 안 됐다.

그래서 deploy.sh에 한 줄 추가해서 run으로 직접 실행한 컨테이너도 삭제할 수 있도록 했다.

자세한 해결 과정

1. 로그 확인하기

(방법: 이전 게시물 참고)

로그를 확인하면 어느 단계에서 문제가 생겼는지 알 수 있다.

아래 ERROR: 부분을 보면 docker 컨테이너 생성 중에 같은 이름의 컨테이너가 이미 있어서 충돌이 발생하고 있다.

이전 게시물에서 설명했듯, 위쪽 네모가 workflow file에서 name이다. 그걸 찾아보자.

2. workflow file에서 1의 name 찾기

  • 트리거 지정

    • develop 브랜치에 push했을 때
    • release 브랜치에 PR 날렸을 때
    • (main 브랜치는 주석 처리 해둠.)
    on:
      push:
        branches:
          # - main
          - develop
      pull_request:
        branches:
          # - main
          - release
  • 실제로 수행할 작업

    jobs:
      build:
        name: Build
        runs-on: ubuntu-latest
        steps:
    • steps
    (생략)
    # 서버에 접속한 뒤 deploy.sh(배포 스크립트)를 실행
    - name: 📌executing remote ssh commands using password📌
          (생략)
            script: |
              sh /(생략)/config/scripts/deploy.sh

1에서 본 name을 찾았다!
(📌executing remote ssh commands using password📌)
물론 실제 코드에 압정 이모티콘은 없다. 설명하려고 표시했다.

여기서 아래 커맨드 실행를 실행하나보다.
sh /(생략)/config/scripts/deploy.sh
deploy.sh 파일을 까보자.

3. deploy.sh 확인하기

# Docker 설치 여부 확인, 없으면 설치
if ! type docker > /dev/null
then
  echo "docker does not exist"
  echo "Start installing docker"
  (생략)

# Docker Compose 설치 여부 확인, 없으면 설치
if ! type docker-compose > /dev/null
then
  echo "docker-compose does not exist"
  echo "Start installing docker-compose"
  (생략)


# 기존 orphan 컨테이너 정리 
echo "stop and remove old containers (with orphans)"
sudo docker-compose -f /(생략)/docker-compose.prod.yml down --remove-orphans

# Docker Compose로 서버 빌드 및 실행
echo "start docker-compose up: ubuntu"
sudo docker-compose -f /(생략)/docker-compose.prod.yml up --build -d

기존 컨테이너를 정리하는 코드에 문제가 있는 것 같다.

보니까 파일 내용에 echo가 있고, (print문 같은 것)
그게 로그에 출력되는 것 같다.

Docker, Docker Compose 설치는 이미 되어있어서 실행되지 않았고,
아래 부분은 잘 실행되고 있다.

  • 기존 컨테이너 정리
  • Docker Compose로 컨테이너 빌드 및 실행

결론 : 기존 컨테이너를 정리하는 명령어가 실행되지만, 제대로 정리되지 않았다.
sudo docker-compose -f /(생략)/docker-compose.prod.yml down --remove-orphans
같은 명령어를 EC2 cli에서 직접 실행해도 여전히 기존 컨테이너가 삭제되지 않았다.

4. 해결

알고 보니 docker-compose로 down을 하면 docker-compose로 up(생성)한 컨테이너만 다운된다고 한다.

docker run으로 개별 컨테이너를 직접 생성한 경우 docker stop, docker rm으로만 제거가 가능하다.

팀원이 어제 배포하고 ec2에서 문제 해결하면서 cli에서 docker run으로 컨테이너를 직접 생성했는지, 그 컨테이너는 docker-compose down으로 삭제가 안 됐던 거다.

그래서 deploy.sh에 한 줄 추가해서 compose를 통하지 않고 직접 run한 web 컨테이너도 삭제하도록 했다.

# 기존 orphan 컨테이너 정리 
echo "stop and remove old containers (with orphans)"
sudo docker-compose -f /home/ubuntu/srv/ubuntu/docker-compose.prod.yml down --remove-orphans
📌sudo docker rm -f web || true📌

(물론 실제 코드에 압정은 없다. 설명을 위해 표시한 거다.)

참고로 web은 컨테이너 이름이고, docker-compose.prod.yml에서 이름을 지정하고 있다.

(+) Docker 명령어

deploy.sh에 있던 명령어를 뜯어보자.

기존 컨테이너 정리

sudo docker-compose -f /(생략)/docker-compose.prod.yml down --remove-orphans

  • sudo : 관리자 권한으로 명령어 실행

  • docker-compose down : docker 컨테이너를 종료(down)시킨다.

    • (docker-compose.yml 또는 지정한 파일)에 정의된 서비스들의 컨테이너를 중지하고 제거
  • -f /(생략)/docker-compose.prod.yml : 파일 지정

    • -f 옵션 없이 실행하면 docker-compose.yml에 정의된 컨테이너를 빌드한다.
    • docker-compose.prod.yml를 빌드하려면 파일을 지정해야 한다.
    • 로컬에서 개발할 때는 docker-compose.yml를, 서버에서는 docker-compose.prod.yml를 쓴다. product(제품)의 prod다.
  • --remove-orphans : (docker-compose.yml 또는 지정한 파일)에 정의되지 않은 서비스의 컨테이너도 함께 제거

새 컨테이너 실행

sudo docker-compose -f /(생략)/docker-compose.prod.yml up --build -d

  • docker-compose up : 이미지 빌드(필요시) + 컨테이너 생성 + 실행

    • down은 컨테이너 종료였고, up은 실행
  • --build : 컨테이너 실행 전에 이미지를 새로 빌드

    • 코드가 변경되었을 때 새로 반영하기 위함
    • --build 안 쓰면 기존 이미지로 컨테이너만 실행
    • up 대신 build를 쓰면 (docker-compose build) 이미지를 빌드만하고 실행하지 않음. 이 경우 별도로 docker-compose up 필요.
  • -d : 백그라운드에서 실행 (데몬 모드)

    • 터미널에서 분리되어 실행 (detached)
    • 안 쓰면 터미널에 로그가 계속 출력되고, 터미널 종료하면 컨테이너도 종료

0개의 댓글