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

이 버전의 GitHub Enterprise는 다음 날짜에 중단되었습니다. 2023-03-15. 중요한 보안 문제에 대해서도 패치 릴리스가 이루어지지 않습니다. 성능 향상, 향상된 보안, 새로운 기능을 위해 최신 버전의 GitHub Enterprise로 업그레이드합니다. 업그레이드에 대한 도움말은 GitHub Enterprise 지원에 문의하세요.

Docker 이미지 게시

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

참고: GitHub 호스트 실행기는 현재 GitHub Enterprise Server에서 지원되지 않습니다. GitHub public roadmap에 예정된 향후 지원에 대해 자세히 알아볼 수 있습니다.

소개

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

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

필수 조건

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

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

이미지 구성 정보

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

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

참고: GitHub Enterprise Server 인스턴스의 GitHub Actions은(는) GitHub.com 또는 GitHub Marketplace의 작업에 대한 액세스가 제한될 수 있습니다. 자세한 내용은 "GitHub.com의 작업에 대한 액세스 관리"을 참조하고 GitHub Enterprise 사이트 관리자에게 문의하세요.

Docker Hub에 이미지 게시

GitHub Enterprise Server에서 새 릴리스를 만들 때마다 워크플로를 트리거하여 이미지를 게시할 수 있습니다. 아래 예제의 워크플로는 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: [self-hosted]
    steps:
      - name: Check out the repo
        uses: actions/checkout@v2
      
      - name: Log in to Docker Hub
        uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      
      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
        with:
          images: my-docker-hub-namespace/my-docker-hub-repository
      
      - name: Build and push Docker image
        uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
        with:
          context: .
          file: ./Dockerfile
          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 Enterprise Server에서 새 릴리스를 만들 때마다 워크플로를 트리거하여 이미지를 게시할 수 있습니다. 아래 예제의 워크플로는 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@v2
      
      - name: Log in to GitHub Docker Registry
        uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
        with:
          registry: docker.pkg.github.com
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      
      - name: Build and push Docker image
        uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
        with:
          context: .
          push: true
          tags: |
            docker.pkg.github.com/${{ github.repository }}/octo-image:${{ github.sha }}
            docker.pkg.github.com/${{ github.repository }}/octo-image:${{ github.event.release.tag_name }}

위의 워크플로는 GitHub Enterprise Server 리포지토리를 체크 아웃하고 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: [self-hosted]
    permissions:
      packages: write
      contents: read
    steps:
      - name: Check out the repo
        uses: actions/checkout@v2
      
      - name: Log in to Docker Hub
        uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      
      - name: Log in to the Docker registry
        uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
        with:
          registry: docker.pkg.github.com
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      
      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
        with:
          images: |
            my-docker-hub-namespace/my-docker-hub-repository
            docker.pkg.github.com/${{ github.repository }}/my-image
      
      - name: Build and push Docker images
        uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

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