Skip to content

Commit d4af46e

Browse files
dockerfile 설명 주석 추가
1 parent 151c7e2 commit d4af46e

File tree

2 files changed

+107
-5
lines changed

2 files changed

+107
-5
lines changed

.github/workflows/deploy.yml

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
# 워크플로우의 이름 지정
2+
name: Deploy to Azure Container Apps
3+
4+
# main 브랜치에 코드가 푸시될 때 자동 실행
5+
on:
6+
push:
7+
branches:
8+
- main
9+
10+
# GitHub Actions 실행 권한 설정 (Azure OIDC 인증 & 코드 읽기)
11+
permissions:
12+
id-token: write
13+
contents: read
14+
15+
jobs:
16+
build-and-deploy:
17+
# GitHub Actions 실행 환경을 Ubuntu 최신 버전으로 설정
18+
runs-on: ubuntu-latest
19+
20+
steps:
21+
# 1️⃣ GitHub 레포지토리 코드 가져오기
22+
- name: Checkout Repository
23+
uses: actions/checkout@v4
24+
25+
# 2️⃣ Azure 로그인 (GitHub Actions에서 OIDC를 통해 보안 인증)
26+
- name: Azure Login using Credentials
27+
uses: azure/login@v1
28+
with:
29+
creds: ${{ secrets.AZURE_CREDENTIALS }}
30+
31+
# 3️⃣ Docker 이미지 빌드 & ACR(Azure Container Registry)로 푸시
32+
# Git SHA를 기반으로 고유한 태그 생성
33+
# Azure에서 직접 Docker 이미지를 빌드하고 ACR에 Push
34+
- name: Build and Push Docker Image to ACR
35+
run: |
36+
az acr login --name ${{ secrets.REGISTRY_NAME }}
37+
38+
IMAGE_TAG="${{ secrets.REGISTRY_NAME }}.azurecr.io/${{ secrets.IMAGE_NAME }}:${{ github.sha }}"
39+
LATEST_TAG="${{ secrets.REGISTRY_NAME }}.azurecr.io/${{ secrets.IMAGE_NAME }}:latest"
40+
41+
az acr build --registry ${{ secrets.REGISTRY_NAME }} \
42+
--image $IMAGE_TAG \
43+
--image $LATEST_TAG \
44+
.
45+
46+
# 4️⃣ Azure Container Apps 환경이 존재하는지 확인 & 없으면 생성
47+
- name: Ensure Container Apps Environment Exists
48+
run: |
49+
ENV_EXISTS=$(az containerapp env show --name ${{ secrets.CONTAINER_APP_ENV }} --resource-group ${{ secrets.RESOURCE_GROUP }} --query "name" --output tsv || echo "notfound")
50+
51+
if [ "$ENV_EXISTS" = "notfound" ]; then
52+
echo "Container Apps Environment not found. Creating..."
53+
az containerapp env create \
54+
--name ${{ secrets.CONTAINER_APP_ENV }} \
55+
--resource-group ${{ secrets.RESOURCE_GROUP }} \
56+
--location ${{ secrets.LOCATION }}
57+
else
58+
echo "Container Apps Environment exists."
59+
fi
60+
61+
# 5️⃣ Azure Container Apps 배포 (앱이 없으면 생성, 있으면 업데이트)
62+
- name: Deploy to Azure Container Apps (Create or Update)
63+
run: |
64+
IMAGE_TAG=${{ secrets.REGISTRY_NAME }}.azurecr.io/${{ secrets.IMAGE_NAME }}:latest
65+
66+
APP_EXISTS=$(az containerapp show --name ${{ secrets.CONTAINER_APP }} --resource-group ${{ secrets.RESOURCE_GROUP }} --query "name" --output tsv || echo "notfound")
67+
68+
if [ "$APP_EXISTS" = "notfound" ]; then
69+
echo "Container App not found. Creating..."
70+
az containerapp create \
71+
--name ${{ secrets.CONTAINER_APP }} \
72+
--resource-group ${{ secrets.RESOURCE_GROUP }} \
73+
--environment ${{ secrets.CONTAINER_APP_ENV }} \
74+
--image $IMAGE_TAG \
75+
--target-port 800 \
76+
--ingress external \
77+
--registry-server ${{ secrets.REGISTRY_NAME }}.azurecr.io \
78+
--registry-username $(az acr credential show --name ${{ secrets.REGISTRY_NAME }} --query "username" --output tsv) \
79+
--registry-password $(az acr credential show --name ${{ secrets.REGISTRY_NAME }} --query "passwords[0].value" --output tsv) \
80+
--env-vars ENV_MODE=${{ secrets.ENV_MODE }} API_KEY=${{ secrets.API_KEY }}
81+
else
82+
# 앱이 있으면 최신 Docker 이미지로 업데이트
83+
echo "Container App found. Updating..."
84+
az containerapp update \
85+
--name ${{ secrets.CONTAINER_APP }} \
86+
--resource-group ${{ secrets.RESOURCE_GROUP }} \
87+
--image $IMAGE_TAG \
88+
--set-env-vars ENV_MODE=${{ secrets.ENV_MODE }} API_KEY=${{ secrets.API_KEY }}
89+
fi

Dockerfile

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,47 @@
11
FROM python:3.9-slim
22

33
# 시스템 패키지 업데이트 및 필요한 의존성 설치
4+
# - apt-get update: Ubuntu/Debian 패키지 목록 최신화
5+
# - build-essential: C/C++ 컴파일러 등 기본 빌드 도구 설치
6+
# (일부 Python 패키지는 설치 시 C/C++ 코드 컴파일이 필요하며, 이를 위한 도구)
7+
# - curl: URL을 통해 데이터를 전송하는 도구 설치
8+
# - rm -rf: 패키지 캐시를 삭제하여 이미지 크기 최적화
49
RUN apt-get update && apt-get install -y \
510
build-essential \
611
curl \
712
&& rm -rf /var/lib/apt/lists/*
813

914
WORKDIR /app
1015

11-
# Poetry 설치 시 네트워크 타임아웃 설정 추가
16+
# Poetry 설치 시 네트워크 타임아웃 설정
1217
ENV POETRY_HTTP_TIMEOUT=120
1318

1419
# Poetry 설치 및 PATH 설정
20+
# - curl로 Poetry 설치 스크립트 다운로드 및 실행
21+
# - ln -s: Poetry 실행 파일의 심볼릭 링크를 생성하여 전역 접근 가능하게 함
22+
# (심볼릭 링크는 원본 파일을 가리키는 바로가기와 같은 것으로,
23+
# /root/.local/bin/poetry를 /usr/local/bin/poetry에서도 접근 가능하게 함)
1524
RUN curl -sSL https://install.python-poetry.org | python3 - && \
1625
ln -s /root/.local/bin/poetry /usr/local/bin/poetry
1726

18-
# Poetry 설정
27+
# Poetry 가상환경 생성 비활성화 (Docker 컨테이너 내부에서는 불필요)
1928
RUN poetry config virtualenvs.create false
2029

21-
# 의존성 파일 복사 및 설치
30+
# 의존성 파일만 먼저 복사 및 설치 (레이어 캐싱 최적화)
31+
# --only main: 개발 의존성 제외하고 주요 의존성만 설치
32+
# --no-root: 현재 프로젝트를 설치하지 않고 의존성만 설치 (캐싱 최적화)
33+
# --no-interaction: 사용자 입력 없이 자동 설치
2234
COPY pyproject.toml poetry.lock* ./
2335
RUN poetry install --only main --no-root --no-interaction
2436

25-
# 애플리케이션 코드 복사
37+
# 모든 애플리케이션 코드를 컨테이너로 복사
2638
COPY . .
2739

2840
EXPOSE 8000
2941

3042
# Python 경로에 현재 디렉토리 추가
3143
ENV PYTHONPATH=/app
3244

33-
# 전체 경로로 uvicorn 실행
45+
# FastAPI 애플리케이션 실행
46+
# app.main:app은 app 패키지의 main 모듈에서 app 인스턴스를 찾아 실행
3447
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

0 commit comments

Comments
 (0)