이 포스트에서는 Github Actions을 이용한 docker hub에 이미지 push까지 진행해보자!
on:
release:
types:
- published
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{github.repository}}
Trigger는 Release 발생시로 설정해주었다. push만으론 믿지못해...
환경변수는 두 개가 필요한데 이는 우리가 docker hub에 이미지를 생성할건데 이미지 build & push에 이용된다. 저 환경변수들은 GitHub Container Registry
관련 변수이다.
조직 혹은 개인 계정에서 컨테이너 이미지를 저장하고 이미지를 레포지토리와 연결할 수 있다.
distribution? jdk를 제공해주는 vender사 중 하나이다.
# jdk 설치
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
토큰에서 권한에 따른 제한이 존재하므로 필요한 권한 설정이 필요하다.
# submodule 접근
- name: Checkout submodule
uses: actions/checkout@v4
with:
submodules: recursive
token: ${{secrets.ACTION_TOKEN}}
또한 submodule 변경이 될 수 있으니 그것도 관리해주어야한다.
# 서브 모듈 변경 점 있으면 update
- name: Git Submodule Update
run: |
git submodule update --remote --recursive
도커허브에 이미지 올려야하니까 로그인해야된다.
내 docker hub 이름이랑 password는 공개되면 안되니까 secret로 관리해줘야한다. 아까 ACTION_TOKEN 만들었던 방법으로 넣어주기.
# docker hub 로그인
- name: Log in to Docker Hub
uses: docker/login-action@v1
with:
username: ${{secrets.DOCKERHUB_USERNAME}}
password: ${{secrets.DOCKERHUB_PASSWORD}}
password는 docker hub에서 생성한 access token을 뜻한다.
profile > account settings > Security > New Access Token
이미지의 메타데이터를 추출한다. steps가 순차적이기도 한데 동시실행도 가능하다. build-push-action
에서 docker hub에 이미지를 push하면 metadata-action
에서 해당 이미지의 tags와 labels를 추출하고 그걸 가지고 docker hub 이미지의 tags와 labels를 적용한다.
# 이미지의 metadata 추출
- name: Extract metadata (tags, labels) for Docker
uses: docker/metadata-action@v4
with:
images: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}
# Docker Hub에 올리기
- name: Build and Push Docker Image
uses: docker/build-push-action@v2
with:
context: .
push: true
tags: ${{secrets.DOCKERHUB_USERNAME}}/study-server
labels: ${{steps.meta.outputs.labels}}
그리고 이 build 되는 과정에서 배포를 위한 Dockerfile이 필요하다.
terminal창에 ./gradlew build
해보면 build/libs에 jar파일이 생성될거다. 해당 jar파일 이름을 COPY에 넣어주면된다.
우리는 /usr/src/app을 작업 디렉토리로 사용할 것이다.
그리고 현재 존재하는 jar파일을 app.jar파일에 복사한 후 terminal에서는 java -jar app.jar이 실행되어 해당 프로젝트가 실행될 것이다.
이건 spring boot 빌드하는 과정이다. ./gradlew clean build -x test 명령어를 실행해야하는데 이러려면 gradlew에 실행권한을 주어야한다.
# 프로젝트 build에 필요한 과정
- name: Grant execute permission for gradlew
run : |
chmod +x gradlew
./gradlew clean build -x test
이러면 Docker hub에 올라간 것을 확인할 수 있다!ㅠㅠ
CD까지 진행한 것은 아니므로 수동으로 로컬에서 image를 받아와 실행해보자
$ docker pull {hub명}/{이미지명}:latest
$ docker images
이미지 확인 후 컨테이너 실행하면 끝!
docker에서도 8080포트가 이용되고 우리도 8080포트에서 실행할 것임을 명시해준다.
$ docker run -dp 8080:8080 {hub명}/{이미지명}:latest
오랜만에 공부하는 이미지 실행 명령어
-d : 백그라운드 실행
-p : 포트포워딩 호스트포트:컨테이너포트
로컬이지만ㅎㅎ
출처
Container Registry 관련
https://docs.github.com/ko/packages/working-with-a-github-packages-registry/working-with-the-container-registry
gitcheckout시 토큰 관련
https://docs.github.com/ko/actions/security-guides/automatic-token-authentication
도커 허브 관련
https://docs.github.com/ko/actions/publishing-packages/publishing-docker-images