From 26f897c7a2193c1ca6d4605abb8807eb9bc1727a Mon Sep 17 00:00:00 2001 From: SD-gif Date: Tue, 25 Aug 2026 15:51:33 +0900 Subject: [PATCH] =?UTF-8?q?fix(ci):=20Redis=20=EC=BB=A8=ED=85=8C=EC=9D=B4?= =?UTF-8?q?=EB=84=88=20=EA=B0=80=EB=93=9C=EA=B0=80=20=EB=B0=B0=ED=8F=AC?= =?UTF-8?q?=EB=A5=BC=20=EC=A3=BD=EC=9D=B4=EB=8D=98=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 두 번째 배포부터 이름 충돌로 실패했다. Error: Conflict. The container name "/redis" is already in use 가드를 이렇게 썼다. if [ -z "$(docker ps -q -f name=^redis$)" ]; then 이 스크립트는 인용하지 않은 heredoc(<< EOF)으로 SSH 에 넘어간다. 그래서 $(...) 가 EC2 가 아니라 GitHub 러너에서 평가된다. 러너에는 redis 컨테이너가 없으니 결과가 늘 비어 조건이 항상 참이 되고, EC2 에 이미 떠 있는 컨테이너를 다시 만들려다 죽는다. 같은 파일의 기존 코드는 \$(...) 로 이스케이프해 EC2 에서 평가되게 해 두었는데, Redis 를 추가하면서 그 규칙을 따르지 않았다. 처음 배포에서는 컨테이너가 없어 통과했고, 그다음 배포에서 드러났다. 조건문에서 명령 치환을 아예 걷어낸다. docker start 는 컨테이너가 있으면 멈춰 있어도 성공하고 없으면 실패하므로, 그것만으로 있으면 재사용하고 없으면 만드는 동작이 된다. 배포가 컨테이너 교체 전 단계에서 멈춰 dev 는 이전 이미지로 계속 떠 있었다. Co-Authored-By: Claude Opus 5 --- .github/workflows/deploy-dev.yml | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/.github/workflows/deploy-dev.yml b/.github/workflows/deploy-dev.yml index 7540aff..eb84e98 100644 --- a/.github/workflows/deploy-dev.yml +++ b/.github/workflows/deploy-dev.yml @@ -297,17 +297,21 @@ jobs: echo "Ensure redis container" - # 리프레시 토큰 저장소. 이미 떠 있으면 건드리지 않는다. - # 재시작해도 로그인 세션이 끊기지 않도록 배포마다 지우지 않는다. - if [ -z "$(docker ps -q -f name=^redis$)" ]; then - docker rm redis || true - docker run -d \ - --name redis \ - --restart unless-stopped \ - --network hackathon-network \ - redis:7-alpine \ - redis-server --save 60 1 --appendonly no - fi + # 리프레시 토큰 저장소. 이미 있으면 그대로 쓰고, 없을 때만 만든다. + # 배포마다 지우면 로그인 세션이 전부 끊긴다. + # + # 조건문에 명령 치환을 쓰지 않는다. 이 스크립트는 인용하지 않은 heredoc + # (<< EOF)으로 SSH 에 넘어가므로 $(...) 가 EC2 가 아니라 러너에서 평가된다. + # 러너에는 이 컨테이너가 없어 조건이 항상 참이 되고, 이미 떠 있는 컨테이너를 + # 다시 만들려다 이름 충돌로 배포가 죽는다. 실제로 한 번 겪었다. + # + # docker start 는 컨테이너가 있으면(멈춰 있어도) 성공하고 없으면 실패한다. + docker start redis 2>/dev/null || docker run -d \ + --name redis \ + --restart unless-stopped \ + --network hackathon-network \ + redis:7-alpine \ + redis-server --save 60 1 --appendonly no echo "Stop old container"