참고: GitHub 호스트 실행기는 현재 GitHub Enterprise Server에서 지원되지 않습니다. GitHub public roadmap에 예정된 향후 지원에 대해 자세히 알아볼 수 있습니다.
소개
이 가이드에서는 Docker 빌드를 수행하는 워크플로를 만든 다음, Docker 이미지를 Docker Hub 또는 GitHub Packages에 게시하는 방법을 보여 줍니다. 단일 워크플로를 사용하여 단일 레지스트리 또는 여러 레지스트리에 이미지를 게시할 수 있습니다.
참고: 다른 타사 Docker 레지스트리로 푸시하려는 경우 “GitHub Packages에 이미지 게시” 섹션의 예제가 좋은 템플릿으로 사용될 수 있습니다.
필수 조건
워크플로 구성 옵션과 워크플로 파일을 만드는 방법을 기본적으로 이해하는 것이 좋습니다. 자세한 내용은 "Github Actions 알아보기"을 참조하세요.
또한 다음 사항을 기본적으로 이해하는 것이 유용할 수 있습니다.
- "암호화된 비밀"
- "자동 토큰 인증"
- "Docker 레지스트리 작업"
이미지 구성 정보
이 가이드에서는 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-action
및 build-push-action
작업을 사용하여 Docker 이미지를 빌드하고 빌드에 성공하면 빌드된 이미지를 Docker Hub로 푸시합니다.
Docker Hub로 푸시하려면 Docker Hub 계정이 있어야 하고 Docker Hub 리포지토리를 만들어야 합니다. 자세한 내용은 Docker 설명서에서 “ "Docker Hub로 Docker 컨테이너 이미지 푸시”를 참조하세요.
Docker Hub에 필요한 login-action
옵션은 다음과 같습니다.
username
및password
: 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
로 설정하면 이미지가 성공적으로 빌드된 경우 레지스트리에 푸시됩니다.
# 이 워크플로는 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-action
및 build-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
로 설정해야 합니다. 아래 표시된 것처럼 단일 태그를 설정하거나 목록에서 여러 태그를 지정할 수 있습니다.
# 이 워크플로는 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-action
및 build-push-action
작업을 사용하여 여러 레지스트리에 Docker 이미지를 게시할 수 있습니다.
다음 예제 워크플로는 이전 섹션의 단계(“Docker Hub 이미지 게시” 및 “GitHub Packages에 이미지 게시”)를 사용하여 두 레지스트리에 푸시하는 단일 워크플로를 만듭니다.
# 이 워크플로는 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 레지스트리로 푸시합니다.