Skip to main content
설명서에 자주 업데이트를 게시하며 이 페이지의 번역이 계속 진행 중일 수 있습니다. 최신 정보는 영어 설명서를 참조하세요.
GitHub AE는 현재 제한된 릴리스에 있습니다.

Docker 이미지 게시

CI(연속 통합) 워크플로의 일부로 Docker Hub 또는 GitHub Packages와 같은 레지스트리에 Docker 이미지를 게시할 수 있습니다.

소개

이 가이드에서는 Docker 빌드를 수행하는 워크플로를 만든 다음, Docker 이미지를 Docker Hub 또는 GitHub Packages에 게시하는 방법을 보여 줍니다. 단일 워크플로를 사용하여 단일 레지스트리 또는 여러 레지스트리에 이미지를 게시할 수 있습니다.

참고: 다른 타사 Docker 레지스트리로 푸시하려는 경우 “GitHub Packages에 이미지 게시” 섹션의 예제가 좋은 템플릿으로 사용될 수 있습니다.

필수 조건

워크플로 구성 옵션과 워크플로 파일을 만드는 방법을 기본적으로 이해하는 것이 좋습니다. 자세한 내용은 "Github Actions 알아보기"을 참조하세요.

또한 다음 사항을 기본적으로 이해하는 것이 유용할 수 있습니다.

이미지 구성 정보

이 가이드에서는 GitHub 리포지토리에 저장된 Docker 이미지에 대한 완전한 정의가 있다고 가정합니다. 예를 들어 리포지토리에는 Dockerfile 및 이미지를 만들기 위해 Docker 빌드를 수행하는 데 필요한 다른 파일이 포함되어야 합니다.

이 가이드에서는 Docker build-push-action 작업을 사용하여 Docker 이미지를 빌드하고 하나 이상의 Docker 레지스트리에 푸시합니다. 자세한 내용은 build-push-action를 참조하세요.

Docker Hub에 이미지 게시

GitHub AE에서 새 릴리스를 만들 때마다 워크플로를 트리거하여 이미지를 게시할 수 있습니다. 아래 예제의 워크플로는 release 이벤트가 created 활동 형식으로 트리거될 때 실행됩니다. 이벤트에 대한 release 자세한 내용은 "워크플로를 트리거하는 이벤트"을 참조하세요.

아래 예제 워크플로에서는 Docker login-actionbuild-push-action 작업을 사용하여 Docker 이미지를 빌드하고 빌드에 성공하면 빌드된 이미지를 Docker Hub로 푸시합니다.

Docker Hub로 푸시하려면 Docker Hub 계정이 있어야 하고 Docker Hub 리포지토리를 만들어야 합니다. 자세한 내용은 Docker 설명서에서 “ "Docker Hub로 Docker 컨테이너 이미지 푸시”를 참조하세요.

Docker Hub에 필요한 login-action 옵션은 다음과 같습니다.

  • usernamepassword: Docker Hub 사용자 이름 및 암호입니다. 워크플로 파일에 노출되지 않도록 Docker Hub 사용자 이름과 암호는 비밀로 저장하는 것이 좋습니다. 자세한 내용은 "암호화된 비밀"을 참조하세요.

Docker Hub에 필요한 metadata-action 옵션은 다음과 같습니다.

  • images: Docker Hub로 빌드/푸시하는 Docker 이미지의 네임스페이스 및 이름입니다.

Docker Hub에 필요한 build-push-action 옵션은 다음과 같습니다.

  • tags: DOCKER-HUB-NAMESPACE/DOCKER-HUB-REPOSITORY:VERSION 형식의 새 이미지 태그입니다. 아래 표시된 것처럼 단일 태그를 설정하거나 목록에서 여러 태그를 지정할 수 있습니다.
  • push: true로 설정하면 이미지가 성공적으로 빌드된 경우 레지스트리에 푸시됩니다.
YAML
# 이 워크플로는 GitHub에서 인증되지 않은 작업을 사용합니다.
# 작업은 타사에서 제공하며
# 별도의 서비스 약관, 개인정보처리방침, 지원 설명서에서 규정됩니다.
# 참조하세요.

# 커밋 SHA에 작업을 고정하는 것이 좋습니다.
# 최신 버전을 얻으려면 SHA를 업데이트해야 합니다.
# 태그 또는 분기를 참조할 수도 있지만 경고 없이 작업이 변경될 수 있습니다.

name: Publish Docker image

on:
  release:
    types: [published]

jobs:
  push_to_registry:
    name: Push Docker image to Docker Hub
    runs-on: ubuntu-latest
    steps:
      - name: Check out the repo
        uses: actions/checkout@v3
      
      - name: Log in to Docker Hub
        uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      
      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
        with:
          images: my-docker-hub-namespace/my-docker-hub-repository
      
      - name: Build and push Docker image
        uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

위의 워크플로는 GitHub 리포지토리를 체크 아웃하고 login-action을 사용하여 레지스트리에 로그인한 다음 build-push-action 작업을 사용하여 리포지토리의 Dockerfile을 기반으로 Docker 이미지를 빌드하고, 이미지를 Docker Hub로 푸시하고, 이미지에 태그를 적용합니다.

GitHub Packages에 이미지 게시

GitHub AE에서 새 릴리스를 만들 때마다 워크플로를 트리거하여 이미지를 게시할 수 있습니다. 아래 예제의 워크플로는 release 이벤트가 created 활동 형식으로 트리거될 때 실행됩니다. 이벤트에 대한 release 자세한 내용은 "워크플로를 트리거하는 이벤트"을 참조하세요.

아래 예제 워크플로에서는 Docker login-actionbuild-push-action 작업을 사용하여 Docker 이미지를 빌드하고 빌드에 성공하면 빌드된 이미지를 GitHub Packages에 푸시합니다.

GitHub Packages에 필요한 login-action 옵션은 다음과 같습니다.

  • registry: docker.pkg.github.com으로 설정해야 합니다.
  • username: ${{ github.actor }} 컨텍스트를 사용하여 워크플로 실행을 트리거한 사용자의 사용자 이름을 자동으로 사용할 수 있습니다. 자세한 내용은 "컨텍스트"을 참조하세요.
  • password: 자동으로 생성된 GITHUB_TOKEN 비밀을 암호에 사용할 수 있습니다. 자세한 내용은 "자동 토큰 인증"을 참조하세요.

GitHub Packages에 필요한 build-push-action 옵션은 다음과 같습니다.

  • push: true로 설정하면 이미지가 성공적으로 빌드된 경우 레지스트리에 푸시됩니다.

  • tags: docker.pkg.github.com/OWNER/REPOSITORY/IMAGE_NAME:VERSION로 설정해야 합니다.

    예를 들어, http://github.com/octo-org/octo-repo에서 GitHub에 저장된 octo-image라는 이미지의 경우 tags 옵션을 docker.pkg.github.com/octo-org/octo-repo/octo-image:latest로 설정해야 합니다. 아래 표시된 것처럼 단일 태그를 설정하거나 목록에서 여러 태그를 지정할 수 있습니다.

YAML
# 이 워크플로는 GitHub에서 인증되지 않은 작업을 사용합니다.
# 작업은 타사에서 제공하며
# 별도의 서비스 약관, 개인정보처리방침, 지원 설명서에서 규정됩니다.
# 참조하세요.

# 커밋 SHA에 작업을 고정하는 것이 좋습니다.
# 최신 버전을 얻으려면 SHA를 업데이트해야 합니다.
# 태그 또는 분기를 참조할 수도 있지만 경고 없이 작업이 변경될 수 있습니다.

name: Publish Docker image

on:
  release:
    types: [published]
jobs:
  push_to_registry:
    name: Push Docker image to GitHub Packages
    runs-on: ubuntu-latest
    permissions:
      packages: write
      contents: read
    steps:
      - name: Check out the repo
        uses: actions/checkout@v3
      
      - name: Log in to GitHub Docker Registry
        uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
        with:
          registry: docker.YOUR-HOSTNAME.com
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      
      - name: Build and push Docker image
        uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
        with:
          context: .
          push: true
          tags: |
            docker.YOUR-HOSTNAME.com/${{ github.repository }}/octo-image:${{ github.sha }}
            docker.YOUR-HOSTNAME.com/${{ github.repository }}/octo-image:${{ github.event.release.tag_name }}

위의 워크플로는 GitHub AE 리포지토리를 체크 아웃하고 login-action을 사용하여 레지스트리에 로그인한 다음 build-push-action 작업을 사용하여 리포지토리의 Dockerfile을 기반으로 Docker 이미지를 빌드하고, 이미지를 Docker 레지스트리로 푸시하고, 커밋 SHA 및 릴리스 버전을 이미지 태그로 적용합니다.

Docker Hub 및 GitHub Packages에 이미지 게시

단일 워크플로에서 각 레지스트리에 login-actionbuild-push-action 작업을 사용하여 여러 레지스트리에 Docker 이미지를 게시할 수 있습니다.

다음 예제 워크플로는 이전 섹션의 단계(“Docker Hub 이미지 게시” 및 “GitHub Packages에 이미지 게시”)를 사용하여 두 레지스트리에 푸시하는 단일 워크플로를 만듭니다.

YAML
# 이 워크플로는 GitHub에서 인증되지 않은 작업을 사용합니다.
# 작업은 타사에서 제공하며
# 별도의 서비스 약관, 개인정보처리방침, 지원 설명서에서 규정됩니다.
# 참조하세요.

# 커밋 SHA에 작업을 고정하는 것이 좋습니다.
# 최신 버전을 얻으려면 SHA를 업데이트해야 합니다.
# 태그 또는 분기를 참조할 수도 있지만 경고 없이 작업이 변경될 수 있습니다.

name: Publish Docker image

on:
  release:
    types: [published]

jobs:
  push_to_registries:
    name: Push Docker image to multiple registries
    runs-on: ubuntu-latest
    permissions:
      packages: write
      contents: read
    steps:
      - name: Check out the repo
        uses: actions/checkout@v3
      
      - name: Log in to Docker Hub
        uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      
      - name: Log in to the Docker registry
        uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
        with:
          registry: docker.YOUR-HOSTNAME.com
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      
      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
        with:
          images: |
            my-docker-hub-namespace/my-docker-hub-repository
            docker.YOUR-HOSTNAME.com/${{ github.repository }}/my-image
      
      - name: Build and push Docker images
        uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

위의 워크플로는 GitHub AE 리포지토리를 체크 아웃하고, login-action을 두 번 사용하여, 두 레지스트리에 모두 로그인하고 metadata-action 작업으로 태그와 레이블을 생성합니다. 그런 다음 build-push-action 작업이 Docker 이미지를 빌드하여 Docker Hub 및 Docker 레지스트리로 푸시합니다.