写在前面

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

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

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

所以用国内服务器的可以利用 GitHub Actions 来帮我们构建 Dockerfile 并 push 到 Docker 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

完结!

参考: