Q. GitHub에 새로운 코드를 올렸는데 클라우드에 올라간 서버는 계속 과거 이미지(과거코드)를 보여줘요!
해당 오류는 25년에 이어 26년에도 발발했다...
과거에도 해당 이슈가 있었다.
이를 번복하지않으려, 나는 항상 AWS의 ECR에 들어가 과거의 image들을 모두 삭제하고 있었다.

다만 이것은 명백한 해결책이 아니었다.
AWS의 ECR에서 docker image를 지운다는 것은 클라우드 드라이브에서 파일을 지운 것과 같다.
EC2(내 서버)에서 컨테이너가 돌아가는 것은 내 컴퓨터에 이미 내려받아 설치된 프로그램을 실행 중인 것 (매번 갱신하는게아니었음)
왜 이런 일이 발생하나요?
- 로컬 캐시 우선: Docker는 docker run을 할 때 로컬에 해당 이름(태그)의 이미지가 있으면 외부(ECR)를 확인하지 않고 로컬 파일을 먼저 사용합니다.
- 컨테이너 점유: 이미지가 컨테이너에 의해 사용 중(Running)이면, Docker는 안전을 위해 해당 이미지를 삭제하지 못하게 보호합니다.
- 태그 불일치: ECR에서 latest를 지웠어도, EC2에는 이미 내려받은 latest 이미지의 레이어 데이터가 그대로 남아있습니다.
실제 EC2 로그를 보자
docker images
결과
[ec2-user@ip-172-31-44-156 ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e6466818fdd 888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo:latest "java -jar /app.jar" 30 hours ago Up 30 hours 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp app
4630ba44c513 redis:latest "docker-entrypoint.s…" 30 hours ago Up 30 hours 6379/tcp redis
[ec2-user@ip-172-31-44-156 ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo latest 381321e59e51 4 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> b75ab3042348 5 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> ad4375e17d94 5 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 294f7c68aae4 5 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 6418e7106a19 5 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 467960239d3d 5 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 34c0e0576f7b 5 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> a092ab668074 5 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 11e2273e1772 5 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 83f197b7ef53 5 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> e42d122df689 6 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 927a44cc69b7 6 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 82085986db99 6 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> f4fc5fad902b 6 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 505619641190 6 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> f04e3ed8b4c9 6 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> b970cf4c966c 6 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 15b569d1b516 6 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 5c42e0605594 6 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 762fb9072b0c 6 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> ea4e82c65494 6 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 724d102f39cf 6 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> b593debd1fa3 6 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 55250abf5361 6 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 0262fb322137 6 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> dcc5b5c19784 6 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> c035aed6e2bc 6 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> c5b6330c731a 6 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 6488cd6b40ba 6 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 9e7672f873fb 6 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> c1dc0286a482 6 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 9c9fa614f041 6 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 3041e298e5fe 6 weeks ago 498MB
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 7c1a2f60e170 2 months ago 498MB
redis latest 1c390e3bb5cb 3 months ago 139MB
4주 전 코드가 latest로 돌아가고있었다. 그외에도 수많이 쌓여있는 docker image들.... 이래서 맨날 gmail로 limit alert! 이게 왔나보다.
더 정확한 코드 - (Created At으로 최신순으로 정렬)
`docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.CreatedAt}}" | sort -k 4 -r`
[ec2-user@ip-172-31-44-156 ~]$ docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.CreatedAt}}" | sort -k 4 -r
REPOSITORY TAG IMAGE ID CREATED AT
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo latest 381321e59e51 2026-01-24 04:56:44 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> b75ab3042348 2026-01-14 17:23:49 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> ad4375e17d94 2026-01-14 16:46:19 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 294f7c68aae4 2026-01-14 16:39:06 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 6418e7106a19 2026-01-14 04:05:10 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 467960239d3d 2026-01-14 03:00:55 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 34c0e0576f7b 2026-01-14 02:14:09 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> a092ab668074 2026-01-14 01:13:57 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 11e2273e1772 2026-01-14 00:56:58 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 83f197b7ef53 2026-01-13 23:25:41 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> e42d122df689 2026-01-13 18:00:29 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 927a44cc69b7 2026-01-13 17:38:57 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 82085986db99 2026-01-13 17:14:15 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> f4fc5fad902b 2026-01-13 16:34:44 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 505619641190 2026-01-13 15:57:42 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> f04e3ed8b4c9 2026-01-13 04:48:40 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> b970cf4c966c 2026-01-13 02:40:09 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 15b569d1b516 2026-01-13 02:21:26 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 5c42e0605594 2026-01-13 02:19:58 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 762fb9072b0c 2026-01-13 02:19:05 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> ea4e82c65494 2026-01-13 02:17:43 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 724d102f39cf 2026-01-13 02:17:17 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> b593debd1fa3 2026-01-13 02:16:16 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 55250abf5361 2026-01-13 02:15:10 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 0262fb322137 2026-01-13 02:13:56 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> dcc5b5c19784 2026-01-13 02:09:07 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> c035aed6e2bc 2026-01-13 02:05:06 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> c5b6330c731a 2026-01-13 02:04:45 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 6488cd6b40ba 2026-01-12 23:42:13 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 9e7672f873fb 2026-01-12 21:14:36 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> c1dc0286a482 2026-01-12 18:00:16 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 9c9fa614f041 2026-01-10 17:03:56 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 3041e298e5fe 2026-01-09 20:28:21 +0900 KST
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo <none> 7c1a2f60e170 2025-12-05 01:43:45 +0900 KST
redis latest 1c390e3bb5cb 2025-11-19 06:52:59 +0900 KST
deploy.yml의 ec2 script을 변경했다.
기존
name: Deploy to EC2 # 이 워크플로우의 이름. GitHub Actions 탭에 표시됨
on:
push:
branches: [ "main" ] # main 브랜치에 push될 때만 이 워크플로우가 실행됨
jobs:
deploy:
runs-on: ubuntu-latest # GitHub Actions가 사용하는 가상 머신 환경 (우분투 최신 버전)
env:
AWS_REGION: ap-northeast-2
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
steps:
- name: Checkout
uses: actions/checkout@v4 # 현재 저장소의 코드를 가져옴 (필수 단계)
- name: Set up JDK
uses: actions/setup-java@v4 # Java 빌드 환경을 설정함
with:
distribution: 'temurin'
java-version: '17' # Java 17 버전을 사용함 (Dockerfile과 일치해야 함)
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
- name: Build
run: ./gradlew clean build -x test # Gradle로 프로젝트를 빌드함. 테스트는 제외 (-x test)
# GitHub Actions에서 ECR에 이미지를 푸시하기 위한 자격 증명 (기존 Access Key 유지)
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Login to ECR
uses: aws-actions/amazon-ecr-login@v2 # ECR에 로그인. 이후 Docker push를 하기 위함
- name: Build and Push Docker Image
run: |
IMAGE_URI=${{ secrets.ECR_REPOSITORY }}:latest # 사용할 Docker 이미지 태그 정의
docker build -t $IMAGE_URI . # 현재 디렉토리(.)에 있는 Dockerfile을 기준으로 이미지 빌드
docker push $IMAGE_URI # 빌드한 이미지를 ECR에 push (업로드)
- name: SSH into EC2 and Deploy
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.EC2_HOST }}
username: ec2-user
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
aws ecr get-login-password --region $AWS_REGION | \
docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com
docker network create rssol-net || true
docker stop redis || true
docker rm redis || true
docker run -d \
--name redis \
--network rssol-net \
redis:latest \
echo "Waiting for Redis to start..."
counter=0
while ! docker exec redis redis-cli ping 2>/dev/null | grep -q PONG; do
sleep 1
counter=$((counter+1))
if [ $counter -ge 20 ]; then
echo "Redis failed to start after 20 seconds. Aborting."
docker logs redis
exit 1
fi
done
echo "Redis is up and running!"
docker stop app || true
docker rm app || true
docker pull ${{ secrets.ECR_REPOSITORY }}:latest
docker run -d \
--name app \
--network rssol-net \
-p 8080:8080 \
-e "SPRING_DATASOURCE_URL=${{ secrets.SPRING_DATASOURCE_URL }}" \
-e "SPRING_DATASOURCE_USERNAME=${{ secrets.SPRING_DATASOURCE_USERNAME }}" \
-e "SPRING_DATASOURCE_PASSWORD=${{ secrets.SPRING_DATASOURCE_PASSWORD }}" \
-e "JWT_SECRET=${{ secrets.JWT_SECRET }}" \
-e "KAKAO_CLIENT_ID=${{ secrets.KAKAO_CLIENT_ID }}" \
-e "KAKAO_CLIENT_SECRET=${{ secrets.KAKAO_CLIENT_SECRET }}" \
-e "KAKAO_REDIRECT_URI=${{ secrets.KAKAO_REDIRECT_URI }}" \
${{ secrets.ECR_REPOSITORY }}:latest
변경
name: Deploy to EC2 # 이 워크플로우의 이름. GitHub Actions 탭에 표시됨
on:
push:
branches: [ "main" ] # main 브랜치에 push될 때만 이 워크플로우가 실행됨
jobs:
deploy:
runs-on: ubuntu-latest # GitHub Actions가 사용하는 가상 머신 환경 (우분투 최신 버전)
env:
AWS_REGION: ${{ secrets.AWS_REGION }}
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
steps:
- name: Checkout
uses: actions/checkout@v4 # 현재 저장소의 코드를 가져옴 (필수 단계)
- name: Set up JDK
uses: actions/setup-java@v4 # Java 빌드 환경을 설정함
with:
distribution: 'temurin'
java-version: '17' # Java 17 버전을 사용함 (Dockerfile과 일치해야 함)
cache: 'gradle'
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
- name: Build
run: ./gradlew clean build -x test # Gradle로 프로젝트를 빌드함. 테스트는 제외 (-x test)
# GitHub Actions에서 ECR에 이미지를 푸시하기 위한 자격 증명 (기존 Access Key 유지)
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Login to ECR
uses: aws-actions/amazon-ecr-login@v2 # ECR에 로그인. 이후 Docker push를 하기 위함
- name: Build and Push Docker Image
run: |
IMAGE_TAG=${{ github.sha }}
IMAGE_URI=${{ secrets.ECR_REPOSITORY }}
docker build -t $IMAGE_URI:$IMAGE_TAG -t $IMAGE_URI:latest .
docker push $IMAGE_URI:$IMAGE_TAG
docker push $IMAGE_URI:latest
- name: SSH into EC2 and Deploy
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.EC2_HOST }}
username: ec2-user
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
REGION="${{ secrets.AWS_REGION }}"
ACCOUNT_ID="${{ secrets.AWS_ACCOUNT_ID }}"
ECR_REPO="${{ secrets.ECR_REPOSITORY }}"
IMAGE_TAG="${{ github.sha }}"
aws ecr get-login-password --region $REGION | \
docker login --username AWS --password-stdin $ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com
docker network create rssol-net || true
docker stop redis || true
docker rm redis || true
docker run -d \
--name redis \
--network rssol-net \
redis:latest \
echo "Waiting for Redis to start..."
counter=0
while ! docker exec redis redis-cli ping 2>/dev/null | grep -q PONG; do
sleep 1
counter=$((counter+1))
if [ $counter -ge 20 ]; then
echo "Redis failed to start after 20 seconds. Aborting."
docker logs redis
exit 1
fi
done
echo "Redis is up and running!"
docker stop app || true
docker rm app || true
docker image prune -a -f
docker pull ${{ secrets.ECR_REPOSITORY }}:${{ github.sha }}
docker run -d \
--name app \
--network rssol-net \
-p 8080:8080 \
-e "SPRING_DATASOURCE_URL=${{ secrets.SPRING_DATASOURCE_URL }}" \
-e "SPRING_DATASOURCE_USERNAME=${{ secrets.SPRING_DATASOURCE_USERNAME }}" \
-e "SPRING_DATASOURCE_PASSWORD=${{ secrets.SPRING_DATASOURCE_PASSWORD }}" \
-e "JWT_SECRET=${{ secrets.JWT_SECRET }}" \
-e "KAKAO_CLIENT_ID=${{ secrets.KAKAO_CLIENT_ID }}" \
-e "KAKAO_CLIENT_SECRET=${{ secrets.KAKAO_CLIENT_SECRET }}" \
-e "KAKAO_REDIRECT_URI=${{ secrets.KAKAO_REDIRECT_URI }}" \
${{ secrets.ECR_REPOSITORY }}:${{ github.sha }}
결과
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bcbcdba1e890 888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo:fdc5933bbc6983aaef71544d449cd116f0d73a83 "java -jar /app.jar" 4 minutes ago Up 4 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp app
f170574d6c41 redis:latest
"docker-entrypoint.s…" 4 minutes ago Up 4 minutes 6379/tcp redis
$ docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.CreatedAt}}" | sort -k 4 -r
REPOSITORY TAG IMAGE ID CREATED AT
888042016323.dkr.ecr.ap-northeast-2.amazonaws.com/rssol-repo fdc5933bbc6983aaef71544d449cd116f0d73a83 80c698051b50 2026-02-24 22:44:39 +0900 KST
redis latest 1c390e3bb5cb 2025-11-19 06:52:59 +0900 KST
이제 이미지 엄청많이 ec2가 가지고있지도않고, createdAt도 현시점으로 잘 배포되어 돌아간다.
배운 점 :
github actions의 로그로 디버깅하는 실력을 키웠다. 로그에서 잘못된점을 찾을 수 있다.
secrets가 제대로주입되면 *** 이런식으로 출력되지만, 주입 제대로 안되면 "" 이렇게 들어간다. (빈칸으로 들어감)
ECR(가상 클라우드)에 올라가있는 이미지랑, EC2(가상 로컬 컴퓨터)에 저장된 이미지는 별개이다.
수정하면서, entity 객체에 기본값을 넣어 줄 때
@Builder.Default 이걸 썼다. builder가 생성할때, 빈 값이 들어오면 자동으로 값을 default값으로 넣어준다는의미.
====================
요약
내 코드 최신버전으로 EC2에서 돌아가고있지않다 -> EC2가 과거 이미지를 계속해서 돌리고있는 중
확인 명령어 ` docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.CreatedAt}}" | sort -k 4 -r`
최신순으로, docker image파일들을 정렬하고, latest 태그가 붙어있는 (혹은 본인이 설정한 태그가 붙어있는) 이미지를 찾아보자.
높은 확률로 과거 이미지에 latest붙어있을 것
문제 원인 : 기존에 ec2가 프리티어이다보니, 용량을 초과하는 새로운 이미지는 저장이 안됐었다.
(본인의 경우, 1달동안 올린 image들은 아무것도 안올라가있었다.)
EC2 프리티어(보통 t2.micro / t3.micro)는 기본적으로 8GB~30GB 정도의 디스크 용량(EBS)만 제공
본인은 20GB정도로 설정해놓았었음. -> 과거에 설정해놓은 용량이 꽉참! -> 이미지 업로드 불가능함
- 이미지 레이어 누적: Docker는 빌드할 때마다 새로운 레이어를 생성합니다.
docker image prune 없이 계속 배포했다면, 옛날 이미지들이 디스크를 점유 - 용량 threshold 도달: 디스크가 거의 가득 차면, 새로운 이미지를 docker pull 할 때 파일을 내려받다가 중단되거나 저장에 실패
- 기존 이미지 재사용: 새 이미지를 받는 데 실패하면, docker run 명령은 로컬에 남아있는 (그나마 이름이 같은) 가장 최근의 성공했던 이미지(과거에생성한거)를 찾아 실행해 버린다.
- 결과: 배포 로그에는 에러가 찍혔을 수 있지만, 컨테이너는 어쨌든 (옛날 버전으로) 돌아가고 있으니 겉으로 보기엔 서비스가 유지되는 것처럼 보였을 것입니다.
해결방법 : deploy할때마다 EC2에 꽉찬 과거 image들을 삭제해준다.
`docker image prune -a -f`
현재 실행 중이지 않은 모든 이미지와 태그 없는 잔해들을 싹 다 지워라 라는 의미의 명령어.
또 새로 알게된 명령어
`df -h`
디스크 용량 확인 명령어이다.
내 디스크 용량이다.
[ec2-user@ip-172-31-44-156 ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 475M 0 475M 0% /dev/shm
tmpfs 190M 640K 190M 1% /run
/dev/xvda1 8.0G 3.9G 4.2G 49% /
tmpfs 475M 0 475M 0% /tmp
/dev/xvda128 10M 1.3M 8.7M 13% /boot/efi
tmpfs 95M 0 95M 0% /run/user/1000
전체 용량: 8.0G
사용 중: 3.9G
여유 공간: 4.2G
사용률: 49%
Java 애플리케이션 이미지 크기가 500mb정도 된다.(내기준) 기존에는 이게 꽉차서 못했었던듯!!
yml파일에 해당 작업을 필수로넣어주어, 필요없는 이미지가 쌓이는 걸 막고 용량을 늘리지말자! 최신버전만 잘 유지하기로!