Skip to main content

Docker 이미지 게시

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

소개

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

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

필수 조건

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

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

이미지 구성 정보

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

미리 정의된 주석 키를 사용하여 컨테이너 이미지에 설명, 라이선스 및 원본 리포지토리를 포함한 메타데이터를 추가할 수 있습니다. 자세한 내용은 "Container registry 작업"을 참조하세요.

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

Docker Hub에 이미지 게시

GitHub에서 새 릴리스를 만들 때마다 워크플로를 트리거하여 이미지를 게시할 수 있습니다. 아래 예제의 워크플로는 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
# <a name="this-workflow-uses-actions-that-are-not-certified-by-github"></a>이 워크플로는 GitHub에서 인증되지 않은 작업을 사용합니다.
# <a name="they-are-provided-by-a-third-party-and-are-governed-by"></a>작업은 타사에서 제공하며
# <a name="separate-terms-of-service-privacy-policy-and-support"></a>별도의 서비스 약관, 개인정보처리방침, 지원 설명서에서 규정됩니다.
# <a name="documentation"></a>참조하세요.

# <a name="github-recommends-pinning-actions-to-a-commit-sha"></a>커밋 SHA에 작업을 고정하는 것이 좋습니다.
# <a name="to-get-a-newer-version-you-will-need-to-update-the-sha"></a>최신 버전을 얻으려면 SHA를 업데이트해야 합니다.
# <a name="you-can-also-reference-a-tag-or-branch-but-the-action-may-change-without-warning"></a>태그 또는 분기를 참조할 수도 있지만 경고 없이 작업이 변경될 수 있습니다.

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

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

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

  • registry: ghcr.io으로 설정해야 합니다.

  • username: ${{ github.actor }} 컨텍스트를 사용하여 워크플로 실행을 트리거한 사용자의 사용자 이름을 자동으로 사용할 수 있습니다. 자세한 내용은 “컨텍스트”를 참조하세요.

  • password: 자동으로 생성된 GITHUB_TOKEN 비밀을 암호에 사용할 수 있습니다. 자세한 내용은 “GITHUB_TOKEN을 사용한 인증”을 참조하세요.

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

  • images: 빌드 중인 Docker 이미지의 네임스페이스 및 이름입니다.

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

  • context: 지정된 경로에 있는 파일 집합으로 빌드의 컨텍스트를 정의합니다.

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

  • tagslabels: metadata-action의 출력으로 채워집니다.

    YAML

이 워크플로는 GitHub에서 인증되지 않은 작업을 사용합니다.

작업은 타사에서 제공하며

별도의 서비스 약관, 개인정보처리방침, 지원 설명서에서 규정됩니다.

참조하세요.

커밋 SHA에 작업을 고정하는 것이 좋습니다.

최신 버전을 얻으려면 SHA를 업데이트해야 합니다.

태그 또는 분기를 참조할 수도 있지만 경고 없이 작업이 변경될 수 있습니다.

name: Create and publish a Docker image

on: push: branches: ['release']

env: REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }}

jobs: build-and-push-image: runs-on: ubuntu-latest permissions: contents: read packages: write

steps:
  - name: Checkout repository
    uses: actions/checkout@v3

  - name: Log in to the Container registry
    uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
    with:
      registry: ${{ env.REGISTRY }}
      username: ${{ github.actor }}
      password: ${{ secrets.GITHUB_TOKEN }}

  - name: Extract metadata (tags, labels) for Docker
    id: meta
    uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
    with:
      images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}

  - 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`을 사용하여 Container registry에 로그인합니다. 그런 다음 Docker 이미지에 대한 레이블 및 태그를 추출합니다. 최종적으로, `build-push-action` 작업을 사용하여 이미지를 빌드하고 Container registry에 게시합니다.


## <a name="publishing-images-to-docker-hub-and--data-variablesproductprodname_registry-"></a>Docker Hub 및 GitHub Packages에 이미지 게시


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

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

```yaml{:copy}
# <a name="this-workflow-uses-actions-that-are-not-certified-by-github"></a>이 워크플로는 GitHub에서 인증되지 않은 작업을 사용합니다.
# <a name="they-are-provided-by-a-third-party-and-are-governed-by"></a>작업은 타사에서 제공하며
# <a name="separate-terms-of-service-privacy-policy-and-support"></a>별도의 서비스 약관, 개인정보처리방침, 지원 설명서에서 규정됩니다.
# <a name="documentation"></a>참조하세요.

# <a name="github-recommends-pinning-actions-to-a-commit-sha"></a>커밋 SHA에 작업을 고정하는 것이 좋습니다.
# <a name="to-get-a-newer-version-you-will-need-to-update-the-sha"></a>최신 버전을 얻으려면 SHA를 업데이트해야 합니다.
# <a name="you-can-also-reference-a-tag-or-branch-but-the-action-may-change-without-warning"></a>태그 또는 분기를 참조할 수도 있지만 경고 없이 작업이 변경될 수 있습니다.

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 Container registry
        uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
        with:
          registry: ghcr.io
          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
            ghcr.io/${{ github.repository }}
      
      - 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 리포지토리를 체크 아웃하고, login-action을 두 번 사용하여, 두 레지스트리에 모두 로그인하고 metadata-action 작업으로 태그와 레이블을 생성합니다. 그런 다음 build-push-action 작업이 Docker 이미지를 빌드하여 Docker Hub 및 Container registry로 푸시합니다.