写在前面

为什么要用 GitHub Actions 来为我们构建 Dockerfile 呢?我直接在服务器上 docker build 不行么?你这不是多此一举吗

肯定有人会有这种想法,因为他们不知道也没用过国内的服务器…

在国内服务器上构建的话,你甚至都可以开一把召唤师峡谷。

所以用国内服务器的可以利用 GitHub Actions 来帮我们构建 DockerfilepushDocker Hub

开始

这里我以 Spring Boot 项目为 Demo,不过你得先去注册 Docker Hub 账号。

新建一个 Spring Boot 工程,里面的代码很简单,就是用来测试的

1
2
3
4
5
6
7
8
@RestController
public class DockerController {

@GetMapping("success")
public String actions() {
return "This is the Docker image I built using GitHub Actions. 🎉";
}
}

application.yaml 里,就配置了一个 8989 端口,然后就没了,最后记得打包(把打包好的移进根目录)

在项目根目录新建并编写 Dockerfile(也是网上抄来的,哈哈)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 基础镜像 jdk1.8
FROM java:8

# 作者
MAINTAINER sudojia

# 把可执行 jar 包复制到基础镜像的根目录下
ADD actions_build_springboot_docker-1.0-RELEASE.jar /actions_build_springboot_docker.jar

# 镜像要暴露的端口,如要使用端口,在执行 docker run 命令时使用 -p 生效
EXPOSE 8989

# 在镜像运行为容器后执行的命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/actions_build_springboot_docker.jar"]

项目结构就这样,只要 Dockerfile 和 JAR 包就好了

images

接下来就开始编写 Actions 代码了

在项目根目录创建 .github/workflows/main.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
name: BuildDockerfileImage

on:
# 防止 Fork 乱用 actions 设置只能手动触发构建
workflow_dispatch:
repository_dispatch:
types: build_docker_image

jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@master

- name: Set up QEMU
uses: docker/setup-qemu-action@v1

- 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: 构建并推送到 Dockerhub 镜像仓库
uses: docker/build-push-action@v2
with:
context: .
file: ./Dockerfile # Dockerfile 位置
platforms: linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64
push: true
tags: |
xxx/actions_build_springboot # 改成你自己的, dockerhub用户名/镜像名

注意:最后一行的 tags 配置项,需修改,用户名/镜像名(镜像名看你喜欢取什么)

接下来就是 GitHub 上的操作了

  1. 新建仓库
  2. 在仓库配置两条密钥(Setting -> Secrets -> New repository secret
Secrets NameValue
DOCKERHUB_USERNAMEDocker Hub 的用户名
DOCKERHUB_TOKENDocker Hub Token,前往生成

随后就可以直接把项目推送到 GitHub 上了。

点击仓库中的 Actions,点击 Run workflow (因为避免一些麻烦事,所以就设置只能手动触发构建)

images

然后在 Docker Hub 就看到此镜像了

images

打开 SSH 工具连接服务器把镜像拉取下来,拉取完成之后执行以下命令开始测试。

1
2
3
4
docker run -d -p 8989:8989 [IMAGES]
# -d 是后台运行容器
# -p 指定端口映射(前者是宿主机端口,后者是容器的端口)一般改前者,也可以不改,可以和容器的端口一致
# [IMAGES] 也就是你的镜像名或者镜像 ID 都可以的啦

打开浏览器访问 http://IP:8989/success

images

完结!

参考: