Docker 빌드
docker-login + docker-build-push 템플릿으로 컨테이너 이미지 빌드 및 푸시
범용 Docker 레지스트리(Docker Hub, GHCR, Harbor 등)에 이미지를 빌드/푸시하는 예제입니다. collabops/docker-login + collabops/docker-build-push 템플릿 조합을 권장합니다.
collabops/docker-login 은 username/password 로 .docker/config.json 을 생성하는 범용 Docker 레지스트리 인증 템플릿입니다. GCP Artifact Registry는 gcloud-docker-auth, AWS ECR은 aws-ecr-auth 를 대신 사용하세요. 인증 없이 push 하면 레지스트리가 denied 를 반환합니다. 자세한 내용은 시스템 템플릿 — Core 를 참고하세요.
기본: 템플릿으로 빌드 & 푸시
docker-login 으로 레지스트리에 인증한 뒤 docker-build-push 로 빌드/푸시합니다. 두 템플릿의 config 경로 기본값이 서로 맞물려 있어 추가 설정이 필요 없습니다.
name: docker-build-push
triggers:
push:
branches: [main]
jobs:
build-and-push:
# Docker 서비스 활성화
services:
- docker
steps:
# 1. 소스 체크아웃
- name: checkout
uses: "collabops/checkout@v2"
with:
repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
# 2. 레지스트리 인증 — .docker/config.json 생성
- name: registry-login
uses: "collabops/docker-login@v1"
with:
registry: ghcr.io # 미지정 시 Docker Hub (docker.io)
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
# 3. 빌드 & 푸시 — 위 인증 정보를 자동으로 사용
- name: build-push
uses: "collabops/docker-build-push@v1"
with:
tags: |
ghcr.io/my-org/myapp:latest멀티 태그 + 멀티 스테이지 빌드
docker-build-push 의 tags 로 여러 태그를 한 번에 푸시하고, target 으로 멀티스테이지 빌드 타겟을, build-args 로 빌드 인자를 전달합니다.
name: multi-tag-build
triggers:
push:
branches: [main]
tags: ["v*"]
env:
REGISTRY: ghcr.io
IMAGE_NAME: my-org/my-app
jobs:
build:
services:
- docker
steps:
- name: checkout
uses: "collabops/checkout@v2"
with:
repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
# 레지스트리 인증
- name: registry-login
uses: "collabops/docker-login@v1"
with:
registry: ${{ env.REGISTRY }}
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
# 멀티스테이지 타겟 + 멀티 태그 빌드 & 푸시
- name: build-push
uses: "collabops/docker-build-push@v1"
with:
# SHA 태그 + latest 태그
tags: |
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ collabops.sha }}
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
target: production # 멀티스테이지 빌드 타겟
build-args: |
NODE_ENV=productiondocker CLI 직접 사용 — 선택적 서비스 활성화
템플릿 대신 docker CLI를 직접 쓸 수도 있습니다. 이때는 docker login --password-stdin 으로 직접 인증해야 합니다. Docker가 필요한 Job에만 services를 선언합니다.
name: selective-docker
triggers:
push:
branches: [main]
jobs:
# 테스트 — Docker 불필요
test:
steps:
- name: unit-test
image: node:18
run: npm test
# 빌드 — Docker 필요
docker-build:
needs: [test]
services:
- docker # 이 Job에만 Docker 서비스 활성화
steps:
- name: build-push
image: docker:27.5-cli
env:
REGISTRY_USERNAME: ${{ secrets.REGISTRY_USERNAME }}
REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }}
run: |
# CLI 직접 사용 시 docker login 으로 인증 — stdin 으로 비밀번호 전달
echo "${REGISTRY_PASSWORD}" | docker login ghcr.io \
-u "${REGISTRY_USERNAME}" --password-stdin
docker build -t ghcr.io/my-org/myapp:${{ collabops.sha }} .
docker push ghcr.io/my-org/myapp:${{ collabops.sha }}
# 배포 — Docker 불필요
deploy:
needs: [docker-build]
steps:
- name: deploy
run: kubectl set image deployment/app app=ghcr.io/my-org/myapp:${{ collabops.sha }}포인트
collabops/docker-login@v1 로 범용 레지스트리에 인증하고 collabops/docker-build-push@v1 로 빌드/푸시하는 조합이 권장 방식입니다.
docker-login 의 config-path 와 docker-build-push 의 docker-config 는 같은 위치를 가리켜야 하며, 기본값끼리는 자동으로 맞물립니다.
GCP Artifact Registry는 gcloud-docker-auth, AWS ECR은 aws-ecr-auth 인증 템플릿을 사용합니다.
services: [docker] 선언만으로 Docker 서비스가 활성화되며, 불필요한 Job에는 선언하지 않습니다.
docker CLI를 직접 쓸 때는 docker login --password-stdin 으로 인증을 직접 처리해야 합니다.