준비 및 확인사항
Docker 이미지 확인 사항
단일 Docker 이미지의 크기는 2GB(유료 구독 시 5GB)까지 지원합니다. 큰 용량의 이미지를 활용해야 하는 경우, 컨테이너보다는 VM이나 온프레미스 방식의 인프라 사용이 적합할 수 있습니다.
Windows Server나 ARM 아키텍처 기반의 Docker 이미지 런타임은 지원하지 않습니다.
공통
1. Dockerfile 작성 시 root 권한으로 스크립트를 작성하고 싶어요.
클라우드타입에서 Dockerfile을 이용하여 배포를 진행하시는 경우 UID 및 GID를 설정하는 스크립트를 작성해주셔야 합니다. 배포되는 서비스는 보안 및 서비스 안정성을 위해 non-root 권한으로 실행하도록 권장하고 있어, 혹 Dockerfile로 배포 시 정상적으로 작동하지 않는 경우 아래의 예시를 참고하여 스크립트 수정 후 재배포 부탁드립니다.
Java Spring Boot(Gradle)
# jar 파일 빌드FROM eclipse-temurin:11 as builderCOPY gradlew .COPY gradle gradleCOPY build.gradle .COPY settings.gradle .COPY src srcRUN chmod +x ./gradlewRUN ./gradlew bootjar# jar 실행FROM eclipse-temurin:11 as runtimeRUN addgroup --system --gid 1000 workerRUN adduser --system --uid 1000 --ingroup worker --disabled-password workerUSER worker:workerCOPY build/libs/*.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-Dspring.profiles.active=${PROFILE}", "-jar", "/app.jar"]Java Spring Boot(Maven)
# jar 파일 빌드FROM eclipse-temurin:11 as builderWORKDIR /opt/appCOPY .mvn/ .mvnCOPY mvnw pom.xml ./RUN ./mvnw dependency:go-offlineCOPY ./src ./src# -Dmaven.test.skip=true 이 mvn install 단계에 설정되지 않으면# 환경변수가 주입되지 않은 상태에서 어플리케이션이 실행되어 에러 발생RUN ./mvnw clean install -Dmaven.test.skip=true# jar 실행FROM eclipse-temurin:11 as runtimeRUN addgroup --system --gid 1000 workerRUN adduser --system --uid 1000 --ingroup worker --disabled-password workerUSER worker:workerWORKDIR /opt/appEXPOSE 8080COPY /opt/app/target/*.jar /opt/app/*.jarENTRYPOINT ["java", "-Dspring.profiles.active=${PROFILE}", "-jar", "/opt/app/*.jar"]Python Flask
FROM python:3.9-slim-busterENV PYTHONDONTWRITEBYTECODE=1ENV PYTHONUNBUFFERED 1ARG UID=1000ARG GID=1000RUN groupadd -g "${GID}" python \&& useradd --create-home --no-log-init -u "${UID}" -g "${GID}" pythonWORKDIR /home/pythonCOPY requirements.txt requirements.txtRUN pip3 install -r requirements.txt# USER 변경은 반드시 pip 패키지 설치 스크립트 이후에 작성되어야 함USER python:pythonENV PATH="/home/${USER}/.local/bin:${PATH}"COPY . .ARG FLASK_ENVARG DB_USERNAMEARG DB_PASSWORDARG DB_URLENV FLASK_ENV=${FLASK_ENV}ENV DB_USERNAME=${DB_USERNAME}ENV DB_PASSWORD=${DB_PASSWORD}ENV DB_URL=${DB_URL}EXPOSE 5000CMD ["gunicorn", "-b", "0.0.0.0:5000", "app:app"]Node.js
# 의존성 설치FROM node:16-busterWORKDIR /appCOPY package*.json ./RUN npm ci --only=productionENV NODE_ENV productionCOPY . .# node 이미지에 이미 "node"라는 사용자가 uid/gid 1000번으로 생성되어 있음USER nodeEXPOSE 3000CMD ["npm", "start"]React
# 프로젝트 빌드FROM node:16-buster AS builderWORKDIR /appCOPY package*.json .RUN npm ciCOPY . .RUN npm run build# Production 런타임FROM nginxinc/nginx-unprivileged:1.23 AS runnerWORKDIR /usr/share/nginx/htmlCOPY /app/build .EXPOSE 3000CMD ["nginx", "-g", "daemon off;"]
2. Dockerfile 내부에서 ARG 와 ENV 로 선언된 값들은 활용하고 싶습니다.
- Dockerfile을 활용하여 배포하는 경우 다음과 같이 변수를 넘기는 두 가지의 방법이 있습니다.
- 빌드 인자(Build Arguments): 빌드 시점에 주입docker build -t app:latest . --build-arg ARG1="VAL1" --build-arg ARG2="VAL2"
- 환경 변수(Environment Variables): 런타임 시점에 주입docker run -d -p 8080:8080 --name app -e ENV1="VAL1" -e ENV2="VAL2" app:latest
- 빌드 인자(Build Arguments): 빌드 시점에 주입