Github Actions를 이용한 Docker Image Build 및 Push
- -
안녕하세요. 오늘은 Github의 Github Actions를 이용하여 Docker Image Build 및 Push 하는 방법에 대해 소개해보고자 합니다.
준비물
Github 계정과 Repository
Docker Hub 계정과 Repository
저는 아래와 같이 Dockerfile을 작성했습니다.
FROM node:erbium-buster-slim
LABEL "repository"="https://github.com/teichae/github-action"
LABEL "maintainer"="tei.chae <tei.chae@kakao.com>"
RUN set -eux ; \
apt-get update -y; \
apt-get install --no-install-recommends -y \
tzdata; \
ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime; \
mkdir /html; \
npm install -g http-server
ADD ./index.html /html
WORKDIR /html
EXPOSE 80
CMD ["http-server", "-p80", "./"]
NPM 설치된 이미지를 불러와서, 간단하게 http 서버를 띄우고 컨테이너 내의 시간을 KST로 변경한 이미지입니다.
그리고 html 폴더 내에 작성한 index.html은 welcome to my github 란 내용이 전부입니다. :)
이제 Github에 index.html과 Dockerfile을 업로드하겠습니다.
새로 생성한 Githbub에 위 파일들을 업로드 완료했습니다.
이제 Actions 탭으로 들어가서 아래와 같이 진행합니다.
①으로 Actions 메뉴로 진입 후 ②의 set up a workflow yourself를 클릭합니다.
이유는 스크립트를 커스텀하게 사용하기 위해서입니다.
아래와 같이 작성해주세요.
name: Github Actions
on:
push:
branches:
- '**'
tags:
- '**'
name은 Workflow의 이름입니다.
on: 은 동작 조건을 이야기하며, 위에 작성된 내용은 branch나 tags가 push 되면 동작을 하도록 조건식을 잡았습니다.
예를 들어 마스터 branch만 사용하고 싶으시면, - master로 사용하시면 됩니다.
이제 jobs을 지정합니다.
아래와 같이 작성해주세요.
jobs:
build:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v2
-
name: Docker meta
id: docker_meta
uses: crazy-max/ghaction-docker-meta@v1
with:
images: teichae/node
tag-semver: |
{{version}}
{{major}}.{{minor}}
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
-
name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Build and push
uses: docker/build-push-action@v2
with:
context: .
file: ./Dockerfile
platforms: linux/amd64
push: true
tags: ${{ steps.docker_meta.outputs.tags }}
labels: ${{ steps.docker_meta.outputs.labels }}
Build라는 Workflow의 단계를 지정합니다.
runs-on을 이용하여 빌드에 사용할 최신 버전의 ubuntu 머신을 시작합니다.
steps를 이용하여 각 단계 별로 사용할 동작들을 지정합니다.
구조적으로 다음과 같습니다.
1. 빌드 머신 준비
2. 빌드 머신에 Repository Check out
3. Docker Meta를 이용하여 생성할 이미지의 이름과 버전 정보 태깅
4. 빌드 머신에 Docker 빌드에 필요한 사항 준비
5. 이미지를 업로드할 Docker Hub 로그인
6. 이미지 빌드 및 Docker Hub로 배포
생소하실 수 있는 steps에 대해 간략하게 소개합니다.
name: Docker meta #스텝의 이름
id: docker_meta #변수의 일부이며 나중에 output값으로 활용 가능
uses: crazy-max/ghaction-docker-meta@v1 #사용할 동작
with: #동작에 대한 input값 사용 선언
images: teichae/node #이미지 이름 지정
tag-semver: | #이미지 이름 뒤에 들어갈 버전 정보
{{version}}
{{major}}.{{minor}}
빌드할 때마다 Actions의 내용을 수정하기엔 번거로운 점이 많아서 찾은 동작으로 저는 위와 같이 활용할 예정입니다.
name: Login to DockerHub #스텝의 이름
uses: docker/login-action@v1 #사용할 동작
with: #동작에 대한 input값 사용 선언
username: ${{ secrets.DOCKERHUB_USERNAME }} #Docker Hub의 사용자 ID
password: ${{ secrets.DOCKERHUB_TOKEN }} #Docker Hub에서 발급 받은 사용자 Token
Docker Hub에 빌드된 내용은 배포하기 위해 사용한 동작입니다.
Docker Hub에서 Token 발행하는 방법은 다음 포스팅에 짧게 설명하도록 하고 아래 링크 남기도록 하겠습니다.
name: Build and push #스텝의 이름
uses: docker/build-push-action@v2 #사용할 동작
with: #동작에 대한 input값 사용 선언
context: . #context
file: ./Dockerfile #빌드 시 사용할 Dockerfile의 위치 지정
platforms: linux/amd64 #이미지 등록 시 Platform 이름 지정
push: true #빌드 후 배포 여부 체크
tags: ${{ steps.docker_meta.outputs.tags }} #빌드 시 위에서 지정한 태그를 사용하도록 지정
labels: ${{ steps.docker_meta.outputs.labels }} #빌드 시 위에서 지정한 태그를 사용하도록 지정
Build 및 Push에 대한 내용입니다.
아래는 완성된 Full Code입니다.
name: Github Actions
on:
push:
branches:
- '**'
tags:
- '**'
jobs:
build:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v2
-
name: Docker meta
id: docker_meta
uses: crazy-max/ghaction-docker-meta@v1
with:
images: teichae/node
tag-semver: |
{{version}}
{{major}}.{{minor}}
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
-
name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Build and push
uses: docker/build-push-action@v2
with:
context: .
file: ./Dockerfile
platforms: linux/amd64
push: true
tags: ${{ steps.docker_meta.outputs.tags }}
labels: ${{ steps.docker_meta.outputs.labels }}
해당 내용을 입력 후 Commit을 합니다.
Commit 후 Actions가 동작하게 되며, 동작하는 과정을 확인할 수 있습니다.
정상적으로 빌드가 완료되었다면 아래와 같은 화면을 볼 수 있습니다.
이제 Docker Hub에서도 확인해보겠습니다.
현재 branch 이름이 main이기 때문에 main이라는 태그로 push 된 것을 확인할 수 있습니다.
이제 tag를 입력하여도 배포되는지 마지막으로 테스트해보겠습니다.
tag 쪽으로 이동하여 아래와 같이 릴리즈를 실행합니다.
릴리즈 후 Actions가 조건 값에 의해 실행되는 것을 확인할 수 있습니다.
배포된 이미지를 확인했을 때 tag에 메이저.마이저 버전을 명시했기 때문에 같이 배포된 것을 확인할 수 있습니다.
이상으로 Github Actions에 대한 가이드를 마칩니다.
감사합니다.
해당 글에 사용한 코드는 아래에서 확인하실 수 있습니다.
'기술 > Application' 카테고리의 다른 글
fatal: unsafe repository 에러 해결 (0) | 2022.04.20 |
---|---|
Docker Hub에서의 Token 발급 방법 (0) | 2020.12.09 |
Terraform Kubernetes Provider 설정하기 (1) (0) | 2020.11.12 |
Packer와 Ansible을 이용한 Docker Image 생성 및 배포 (4) | 2020.11.10 |
Argo CD를 이용한 Canary 배포 (4) (0) | 2020.10.22 |
소중한 공감 감사합니다