本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
一、前言
上节中,我们使用 Spring Boot
搭建了简单的 Web 应用,本节中我们将代码上传至 Github
,并利用 Github Actions
快速完成自动化打包上传镜像的功能。
二、制作 Dockerfile
文件构建镜像
Dockerfile
是一个用来构建镜像的文本文件
我们在上一节项目的根目录下创建一个 Dockerfile
文件
Dockerfile
文件中我们定义了基础镜像的版本,以及如何运行Jar
包,开放那个端口等信息,此处只是简单实例,还有很多可自动以的配置项
# Docker image for springboot file run
# VERSION 0.0.1
# Author: sdp
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER sdp <[email protected]>
# VOLUME 指定了临时文件目录为/tmp。
# 效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为common-mail-service.jar
ADD target/common-mail-service-0.0.1-SNAPSHOT.jar /common-mail-service.jar
# 运行jar包
RUN bash -c 'touch /common-mail-service.jar'
ENV TZ 'Asia/Shanghai'
EXPOSE 8089
ENTRYPOINT ["java","-jar","/common-mail-service.jar"]
复制代码
三、上传代码
熟悉了解 Git
的盆友,可以直接跳过该步骤
1. 创建代码仓库并获取代码仓库地址
特殊说明:
下图中三项内容,如果本地项目已存在,创建 Repo 时就先不要勾选,避免出现项目文件冲突的情况出现
2. 上传代码
完整步骤 FYI :
echo "# mail-service" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M master
git remote add origin https://github.com/xxx/mail-service.git
git push -u origin master
复制代码
四、获取 DockerHub
镜像仓库配置
因为我们使用 Github Actions
来自动化的将项目代码打成镜像,并上传到镜像仓库中。所以我们需要准备一个镜像仓库,本文中注册账户并开通了一个开放的 DockerHub
镜像仓库存放镜像。本文中以公有的 DockerHub
镜像仓库为例,如已有私库或阿里云等云平台的镜像仓库,也可直接使用。
1. 创建镜像仓库
创建自定义的镜像仓库
2. 设置 access_token
自动化推送镜像需要账户和 access_token
信息,可以在 Accout Settings->Security
中新建一个 access_token
作为凭据。
提醒:
access_token 创建后,弹窗中会显示并有复制按钮,请务必将 access_token 复制保存下来,这个界面关闭后就无法看到 access_token
五、配置 Github Actions
下面开启 Github Actions
功能,编写工作流自定义配置文件
1. 开启 Github Acitons
功能,如下图:
2. 创建 Github Acitons
所需的密钥参数
推送镜像到 DockerHub
镜像仓库,需要用到上面创建的 DockerHub
账户和 access_token
凭证。在 Settings->Secrets
下 New repository secret
创建所需密钥键值对。
-
DOCKER_HUB_USER 值为
DockerHub
账户 -
DOCKER_HUB_TOKEN 值上步骤中
DockerHub
下创建的access_token
凭证
完成上述步骤,下一步我们开始定义 CI 文件
3. 创建 docker_push.yml
自定义CI流程
name: Build and Publish Docker Image
# refer to https://github.com/actions/starter-workflows/blob/main/ci/docker-push.yml
on:
# push 时触发,分支为 master
push:
branches:
- master
env:
# Use docker.io for Docker Hub if empty
REGISTRY: docker.io
# <repo>
IMAGE_NAME: candy-common-mail-service
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Cache Maven packages
uses: actions/[email protected]
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2
# 编译打包
- name: Build with Maven
run: mvn package -Dmaven.test.skip=true
# Login against a Docker registry except on PR
# https://github.com/docker/login-action
- name: Log into registry ${{ env.REGISTRY }}
if: github.event_name != 'pull_request'
uses: docker/login-action@v1
with:
registry: ${{ env.REGISTRY }}
username: ${{ secrets.DOCKER_HUB_USER }}
password: ${{ secrets.DOCKER_HUB_TOKEN }}
# Extract metadata (tags, labels) for Docker
# https://github.com/docker/metadata-action
- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v3
with:
images: ${{ env.REGISTRY }}/${{ secrets.DOCKER_HUB_USER }}/${{ env.IMAGE_NAME }}
- name: Get Time
id: time
uses: nanzm/[email protected]
with:
timeZone: 8
format: 'YYYY-MM-DD-HH-mm-ss'
# Build and push Docker image with Buildx (don't push on PR)
# https://github.com/docker/build-push-action
- name: Build and push Docker image
uses: docker/build-push-action@v2
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}-${{ steps.time.outputs.time }}
labels: ${{ steps.meta.outputs.labels }}
复制代码
4. 完成上述步骤,点击 Actions
可以看到已经触发的工作流
5. DockerHub
镜像仓库上检查镜像
看到已经成功上传了新的镜像 ~~~ ✿✿ヽ(°▽°)ノ✿
小结
本节我们创建了镜像文件 Dockerfile
,在 Github
上配置了 Github Actions
功能,在推送代码的同时自动化的打包镜像,上传至 DockerHub
镜像仓库中。
下节预告
本节我们已经成功打包了镜像,下一步我们会在本地配置一个 K8S
测试环境,部署已创建镜像,对外提供服务。