Skip to content

refactor: 오래된 이미지 삭제 후 이미지 pull하도록 변경#653

Merged
whqtker merged 1 commit intosolid-connection:developfrom
whqtker:fix/652-modify-docker-image-managing-process
Feb 14, 2026
Merged

refactor: 오래된 이미지 삭제 후 이미지 pull하도록 변경#653
whqtker merged 1 commit intosolid-connection:developfrom
whqtker:fix/652-modify-docker-image-managing-process

Conversation

@whqtker
Copy link
Member

@whqtker whqtker commented Feb 14, 2026

관련 이슈

작업 내용

기존에는 도커 이미지를 pull한 후, 오래된 이미지를 사용하기에 이후 deploy 시 오래된 이미지로 인해 디스크 용량이 부족해지는 경우 pull을 받지 못해 배포가 실패하는 상황이 있었습니다.

이에 deploy 전 오래된 이미지를 삭제하고 pull하도록 프로세스 순서를 변경하였습니다.

추가로 기존에는 이미지를 5개 유지하고 있었는데, 현재 실행하는 이미지 + 롤백용 이미지 총 2개만 유지해도 된다고 판단하여, 추가 수정했습니다.

특이 사항

리뷰 요구사항 (선택)

@whqtker whqtker self-assigned this Feb 14, 2026
@whqtker whqtker added the 버그 Something isn't working label Feb 14, 2026
@coderabbitai
Copy link

coderabbitai bot commented Feb 14, 2026

Walkthrough

  1. dev-cd.yml 변경: GHCR 이미지 보존을 5개에서 2개로 줄이고, 배포 전에 오래된 태그 삭제 및 댕글링 이미지 프룬(사전 정리) 과정을 추가하여 도커 로그인·풀·업 이전에 정리 흐름을 재배치했습니다.
  2. dev-cd.yml 추가 수정: 배포 후 정리 블록을 제거하고 Spring Boot 재시작을 풀 직후로 조정했으며, 관련 출력 메시지와 변수(IMAGE_NAME_BASE 등)를 정리했습니다.
  3. prod-cd.yml 포맷팅: SSH heredoc의 후행 개행 처리만 조정했으며 실행 동작은 변경되지 않았습니다.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Suggested reviewers

  • wibaek
  • JAEHEE25
  • lsy1307
  • sukangpunch
  • Gyuhyeok99
🚥 Pre-merge checks | ✅ 6
✅ Passed checks (6 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목은 작업 내용의 핵심 변경사항인 '오래된 이미지 삭제 후 이미지 pull하도록 변경'을 명확하게 요약하고 있습니다.
Description check ✅ Passed PR 설명이 템플릿 구조를 따르고 있으며, 관련 이슈, 작업 내용이 충분히 기재되어 있습니다.
Linked Issues check ✅ Passed 배포 시 디스크 용량 부족으로 인한 이미지 pull 실패 방지 요구사항 [#652]에 대해, 코드 변경이 이를 충분히 충족합니다.
Out of Scope Changes check ✅ Passed 모든 변경사항이 #652 요구사항(이미지 정리 순서 변경, 유지 이미지 수 축소)과 연관되어 있으며, 범위를 벗어난 변경은 없습니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Merge Conflict Detection ✅ Passed ✅ No merge conflicts detected when merging into develop

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

No actionable comments were generated in the recent review. 🎉

🧹 Recent nitpick comments
.github/workflows/dev-cd.yml (2)

128-136: Pull 전 정리 로직이 잘 구성되어 있습니다. 다만, 엣지 케이스 하나를 확인해 주세요.

  1. sort -rYYYYMMDD-HHMMSS 형식 태그에 대해 사전순 = 시간순이므로 정확하게 동작합니다.
  2. tail -n +3으로 최신 2개를 제외하고, || true로 실행 중인 컨테이너가 사용하는 이미지 삭제 실패를 안전하게 무시합니다.
  3. docker image prune -f로 댕글링 이미지까지 정리하여 디스크 공간 확보가 이루어집니다.

한 가지 참고 사항: 현재 정리 시점(Lines 128-136)에서는 기존 컨테이너가 아직 실행 중(docker compose down은 Line 146)이므로, 실행 중인 이미지는 docker rmi가 실패합니다. || true 덕분에 워크플로우는 중단되지 않지만, 실질적으로 유지되는 이미지 수가 의도한 2개보다 많을 수 있습니다. 현재 동작에 문제는 없지만, 이 점을 인지하고 계시면 좋겠습니다.

💡 (선택) 더 확실한 정리를 원한다면 down 후 정리하는 방안

컨테이너를 먼저 내린 뒤 정리하면 실행 중 이미지도 확실히 삭제할 수 있습니다. 다만, 새 이미지 pull 실패 시 롤백할 컨테이너가 없어지는 트레이드오프가 있으므로 현재 방식도 합리적입니다.

-            # 2. Pull 전 정리 (디스크 공간 확보)
-            echo "Cleaning up old tagged images (keeping last 2)..."
-            docker images "${IMAGE_NAME_BASE}" --format "{{.Tag}}" | \
-            sort -r | \
-            tail -n +3 | \
-            xargs -I {} docker rmi "${IMAGE_NAME_BASE}:{}" || true
-
-            echo "Pruning dangling images..."
-            docker image prune -f
-
-            # 3. GHCR 로그인 & Pull
+            # 2. GHCR 로그인
             echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
+
+            # 3. 기존 컨테이너 중지 & 정리 & Pull
+            cd /home/${{ secrets.DEV_USERNAME }}/solid-connection-dev
+            docker compose -f docker-compose.dev.yml down || true
+
+            echo "Cleaning up old tagged images (keeping last 2)..."
+            docker images "${IMAGE_NAME_BASE}" --format "{{.Tag}}" | \
+            sort -r | \
+            tail -n +3 | \
+            xargs -I {} docker rmi "${IMAGE_NAME_BASE}:{}" || true
+            docker image prune -f
+
             echo "Pulling new image: $FULL_IMAGE_NAME"
             docker pull $FULL_IMAGE_NAME
+
+            # 4. Spring Boot 앱 시작
-            # 4. Spring Boot 앱 재시작
-            echo "Restarting Docker Compose with tag: $IMAGE_TAG_ONLY"
-            cd /home/${{ secrets.DEV_USERNAME }}/solid-connection-dev
-            docker compose -f docker-compose.dev.yml down || true
+            echo "Starting Docker Compose with tag: $IMAGE_TAG_ONLY"
             OWNER_LOWERCASE=$OWNER_LOWERCASE IMAGE_TAG=$IMAGE_TAG_ONLY docker compose -f docker-compose.dev.yml up -d

130-133: docker images 출력에 <none> 태그가 포함될 수 있는 점을 방어해 주세요.

docker images "${IMAGE_NAME_BASE}" --format "{{.Tag}}" 결과에 태그가 없는 이미지가 <none>으로 출력될 수 있습니다. 이 경우 docker rmi "${IMAGE_NAME_BASE}:<none>"이 실행되어 불필요한 에러가 발생합니다. || true로 인해 실패하지는 않지만, grep으로 필터링하면 더 깔끔합니다.

🔧 `` 태그 필터링 추가
             docker images "${IMAGE_NAME_BASE}" --format "{{.Tag}}" | \
+            grep -v '<none>' | \
             sort -r | \
             tail -n +3 | \
             xargs -I {} docker rmi "${IMAGE_NAME_BASE}:{}" || true

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In @.github/workflows/dev-cd.yml:
- Around line 148-150: The SSH command string in the "Run deployment on server"
step is missing its closing single quote, leaving the SSH heredoc/unquoted
string unclosed (you can spot the block that begins with a single quote and ends
near the echo "Deployment finished successfully."); fix by adding the missing
trailing single quote to close that SSH command string in the dev-cd.yml deploy
step (ensure the closing quote mirrors the opening quote used), then validate
the YAML by checking quotes are balanced for the deploy SSH block and that
indentation/pipe/quote usage remains correct so the workflow parses and the SSH
command runs.

- 추가로 이미지는 5개 -> 2개 보관하도록 변경
@whqtker whqtker force-pushed the fix/652-modify-docker-image-managing-process branch from ed37b46 to dc64b54 Compare February 14, 2026 07:48
@whqtker whqtker merged commit 6e9ee44 into solid-connection:develop Feb 14, 2026
1 of 4 checks passed
whqtker added a commit that referenced this pull request Feb 18, 2026
refactor: 오래된 이미지 삭제 후 이미지 pull하도록 변경 (#653)

- 추가로 이미지는 5개 -> 2개 보관하도록 변경
@whqtker whqtker mentioned this pull request Feb 18, 2026
whqtker added a commit that referenced this pull request Feb 19, 2026
* feat: 파견 대학 테이블명 변경 및 협정 대학 테이블 추가하는 DDL 작성 (#620)

* feat: 파견 대학 테이블명 변경 및 협정 대학 테이블 추가하는 DDL 작성

* refactor: 테이블명 변경 및 추가에 따른 엔티티 생성

- 또한 목데이터 생성 로직 수정

* test: 테스트 코드에서 University -> HostUniversity로 변경

* chore: 중복 인덱스 생성 방지를 위해 인덱스 생성 제거

- FK 제약조건을 추가할 때 인덱스가 없다면 알아서 추가하기 때문

* chore: home_university 테이블에 created/updated_at 추가

* refactor: 잘못 설정되었던 테이블 간 연관 관계 재설정 (#622)

* refactor: home_university와 university_info_for_apply가 FK 관계를 가지도록

* chore: FK 변경에 따른 목데이터 수정

* test: 테스트 픽스터 수정

* refactor: 대학 검색 응답 수정 (#624)

* refactor: home_university와 university_info_for_apply가 FK 관계를 가지도록

* chore: FK 변경에 따른 목데이터 수정

* refactor: 필터 검색 엔드포인트 삭제

* refactor: 필터 검색 관련 서비스 로직 삭제

* refactor: 필터 검색 관련 레포지토리 메서드 삭제

* refactor: 필터 검색 관련 DTO 삭제

* test: 필터 검색 관련 테스트 코드 삭제

* refactor: 지원 대학 관련 응답에 협정 대학 이름 추가

* test: 지원 대학 응답 수정에 따른 테스트 수정

* refactor: 간접 참조 대신 연관관계 추가

- N+1 방지를 위해 fetch join도 추가

* test: 간접 참조 방식에서 연관 관계 설정으로 따른 테스트 코드 수정

* chore: 목데이터에서 지원 대학 테이블에 협정 대학 ID를 설정하도록

* test: home university fixture 추가

* refactor: home university에 대한 fetch join 추가

* refactor: s3 버전 업그레이드 및 로직 수정 (#608)

* refactor: s3 sdk 버전 업그레이드
- 의존성 수정
- 버전 업그레이드에 따른 코드 수정

* refactor: 이미지 이외의 파일 관리를 위해 ImgType 의미 명확하도록 수정
- ImgType에서 UploadType으로 변경
- 해당되는 파일 모두 수정

* refactor: s3 테스트 코드 추가

* fix: s3 access-key, secret-key 최신화, 버킷 명칭 올바르게 수정

* fix: ChatService Test 변경점 반영, S3ServiceTest 단위 테스트로 변경
- images->files로 디렉토리 경로 수정

* fix: 이중 비동기 실행문제 해결
- @async에 전적으로 위임

* refactor: S3Service error 메시지 NPE 가능성 제거

* refactor: 수정사항 반영
- UploadType -> UploadPath로 명칭변경
- 컨벤션 수정(미사용 변수 삭제, 들여쓰기, 명칭변경)

* fix: 테스트 코드 오류 수정
- 내부 로직에서 사용하는 fileUploadService 정의

* refactor: 수정사항 반영
- 파일 확장자 상수화
- 확장자 확인로직, 채팅이면 모든 파일 허용, 이미지 확인까지 모두 enum에서 관리
- MultipartFile이 비동기 과정에서 유실되지 않도록 byte로 변환해서 전달
- UrlPrefixResponse PascalCase로 변경

* refactor: 컨벤션 수정
- 사용하지 않는 import문 삭제

* refactor: 리프레시 토큰 만료시 쿠키 삭제 (#628)

* refactor: 리프레시 토큰 만료시 쿠키 삭제

* refactor: 인증 전용 예외 생성

* refactor: 멘토링 조회 응답에 mentoringId 필드 추가 (#638)

* feat: WebSocket 로깅 인터셉터 작성 (#635)

* feat: WebSocket 로깅 인터셉터 작성

* refactor: Principal 명시적 형 변환 대신 null 체크하여 형 변환

* feat: 어드민에서 파견 대학을 관리하도록 (#633)

* feat: 파견 대학 CRUD 관련 ErrorCode 추가

- HOST_UNIVERSITY_HAS_REFERENCES : 파견 대학 삭제 시 해당 대학을 참조하는 UnivApplyInfo가 존재하는 경우

* feat: 파견 대학 관련 정보를 업데이트하는 도메인 메서드 작성

* feat: 조회 관련 Repository 메서드 구현

* feat: 파견 대학 검색 관련 QueryDSL로 구현

* feat: 어드민 파견 대학 CRUD 관련 DTO 작성

* feat: country 조회 관련 로직 추가 및 ErrorCode 추가

* feat: 어드민 파견 대학 CRUD 관련 서비스 로직 작성

* feat: 어드민 파견 대학 관련 컨트롤러 작성

* test: 어드민 파견 대학 관리 관련 테스트 작성

* refactor: 엔드포인트의 path variable 이름 변경

- id -> host-university-id

* refactor: PageResponse 응답 객체를 사용하도록

* test: 응답 변경에 따른 테스트 코드 수정

* fix: host_university 테이블의 korean_name 필드에 unique key 추가 (#645)

* fix: host_university 테이블의 korean_name 필드에 unique key 쿠가

* test: test용 hostUniversityRepository 생성

* test: 고유한 korean_name을 가진 host university 객체를 사용하도록

* fix: 멘토 지원서 승인 시 유저 Role 을 Mentor로 승격 (#639)

* fix: 멘토 지원서 승인 시 유저 Role 을 Mentor로 승격

* fix: 멘토 지원서 승인 시 멘토 생성

* fix: 멘토의 introduction, passTip null 허용하도록 수정

- not null 인 필드에 빈문자열로 값을 채우는 것 보다, null 허용이 더 의미
  있다 판단하여 null 을 허용하도록 하였습니다.

* fix: 사용하지 않는  멘토 생성 api 제거

- 멘토 생성의 주체가 어드민으로 변경되어 Mentor 도메인의 Mentor 생성 api 를 제거

* feat: 멘토 지원서 승인 예외처리 추가

- 중복 멘토 생성 예외 처리 및 테스트 추가

* refactor: Mentor 생성 시 null 전달 제거

* refactor: 멘토 지원서 승낙 시, 검증 후 승격 및 멘토 생성

* chore: 스크립트 버전 수정 (#651)

* chore: 스크립트 버전 수정

* test: korean_name 컬럼 UK 관련 테스트 코드 수정

* feat: test skill 추가 (#647)

* feat: serena MCP 추가

* feat: test skill 추가

* feat: hook 추가

- 응답 대기시 알람발송
- 컨벤션 어겼을 때 훅 작동

* feat: 안쓰는 파일 제거

* fix: 게시글 중복 생성 방지 (#649)

* fix: 게시글 중복 생성 방지

- Redis 패키지 및 로직 정리

* fix: 게시글 중복 생성 방지

- 게시글 중복 요청 방지 Redis 로직 추가

* refactor: 게시글 중복 생성 방지

* chore: testcontainer 버전 업 (#659)

* chore: windows에서도 hook이 동작하도록 (#655)

* refactor: 오래된 이미지 삭제 후 이미지 pull하도록 변경 (#653)

refactor: 오래된 이미지 삭제 후 이미지 pull하도록 변경 (#653)

- 추가로 이미지는 5개 -> 2개 보관하도록 변경

* refactor: 멘토 도메인 응답의 사용자 id를 siteUserId로 통일 (#665)

* refactor: 멘토 관련 id응답은 모두 site-user-id가 되도록 수정

* test: 멘토 관련 테스트 코드 수정

* refactor: 채팅 도메인 응답의 사용자 관련 id를 siteUserId로 통일 (#666)

* refactor: 채팅 관련 응답에서 사용자 관련 Id를 siteUserId로 통일

* refactor: siteUserId를 포함하도록 서비스 코드 수정

* test: 사용자 id로 응답 통일 관련 테스트 수정

* feat: 전체 뉴스를 조회하는 API 구현 (#674)

* feat: 전체 news 조회 API 구현

- 기존 API에 author-id를 선택적으로 받도록

* test: 전체 news 조회 관련 테스트 코드 작성

* refactor: 날짜 오름차순으로 news 조회하는 JPA 메서드 추가

* refactor: 뉴스 조회 API를 하나로 통합

- 서비스 계층에서 siteUserId == null을 기준으로 분기하도록

* refactor: 컨트롤러 계층에서 분기문 제거

- 분기를 서비스 계층에게 위임했음

* test: 뉴스 조회 관련 테스트 코드 수정

* chore: 누락된 제약 조건을 추가하는 스크립트 작성 (#676)

---------

Co-authored-by: Yeon <84384499+lsy1307@users.noreply.github.com>
Co-authored-by: 황규혁 <126947828+Gyuhyeok99@users.noreply.github.com>
Co-authored-by: hyungjun <115551339+sukangpunch@users.noreply.github.com>
Co-authored-by: 정재희 <y2hjjh@naver.com>
@whqtker whqtker mentioned this pull request Feb 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

버그 Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix: 서버 용량 부족으로 인한 도커 이미지 다운로드 실패

1 participant