GitHub Actions 自动构建镜像 并发布到 Docker Hub

引言

  • 通过GitHub的源代码自动构建镜像
  • 将镜像上传到 Docker Hub
  • 自动部署:远程服务器 pull Docker Hub

本文以 SimCaptcha 项目为例。

deploy-docker.yml

.github/workflows/deploy-docker.yml

deploy-docker.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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
name: Docker Image CI/CD
on:
push:
branches: [ master ]
jobs:
# 构建并上传 Docker镜像
build:
runs-on: ubuntu-latest # 依赖的环境
steps:
- uses: actions/checkout@v2
- name: Build Image
run: |
docker build -t yiyungent/simcaptcha -f examples/EasyAspNetCoreService/Dockerfile .
docker build -t yiyungent/simcaptcha-client -f examples/AspNetCoreClient/Dockerfile .
- name: Login to Registry
run: docker login --username=${{ secrets.DOCKER_USERNAME }} --password ${{ secrets.DOCKER_PASSWORD }}
- name: Push Image
run: |
docker push yiyungent/simcaptcha
docker push yiyungent/simcaptcha-client

# Docker 自动部署
deploy-docker:
needs: [build]
name: Deploy Docker
runs-on: ubuntu-latest
steps:
- name: Deploy
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }} # 服务器ip
username: ${{ secrets.HOST_USERNAME }} # 服务器登录用户名
password: ${{ secrets.HOST_PASSWORD }} # 服务器登录密码
port: ${{ secrets.HOST_PORT }} # 服务器ssh端口
script: |
# 切换工作区
cd simcaptcha
# 下载 docker-compose.yml
wget -O docker-compose.yml https://raw.githubusercontent.com/yiyungent/SimCaptcha/master/docker-compose.yml
# 停止并删除旧 容器、网络、挂载点
#docker-compose down # TODO: docker-compose: command not found. 不知道为什么找不到 docker-compose,但直接连接服务器执行就可以
/usr/local/python3/bin/docker-compose down
# 删除旧镜像
docker rmi yiyungent/simcaptcha
docker rmi yiyungent/simcaptcha-client
# 登录镜像服务器
docker login --username=${{ secrets.DOCKER_USERNAME }} --password ${{ secrets.DOCKER_PASSWORD }}
# 创建并启动容器
#docker-compose up -d --build
/usr/local/python3/bin/docker-compose up -d --build

补充

docker-compose CLI

docker-compose build

1
build              Build or rebuild services

docker-compose build --pull

1
--pull                  Always attempt to pull a newer version of the image.

docker-compose pull

1
pull               Pull service images

docker-compose up

1
up                 Create and start containers

其实直接一个up 就可以,如果没有build,则自动build,但是并不是每次都会build,如果已经存在镜像,则不build,如果要每次都build,则 up --build

docker-compose down

1
down               Stop and remove containers, networks, images, and volumes

注意:虽然文档说是会删除镜像,但实际测试,使用 docker images,依然会显示有镜像,不过,确实相关容器被停止并删除

docker-compose push

1
push               Push service images

示例:

1
docker-compose -f docker-compose.Debug.yml up -d

CentOS 用户,组

参考:

添加用户 deploy-docker

1
adduser deploy-docker

补充:

在新建用户的同时添加到 docker组

1
adduser -g docker deploy-docker

为此用户设置密码

1
passwd deploy-docker

给已有用户增加组

1
usermod -G docker deploy-docker

或者

1
gpasswd -a username groupname

注意:

添加用户到某一个组

可以使用usermod -G groupname username这个命令可以添加一个用户到指定的组,但是以前添加的组就会清空掉。

所以想要添加一个用户到一个组,同时保留以前添加的组时,请使用gpasswd这个命令来添加操作用户

查看当前用户所在组

1
groups

查看指定用户所在组

1
groups username

查看有哪些组

1
cat /etc/group

查看有哪些用户

1
cat /etc/passwd

ERROR: Failed to Setup IP tables

1
2
3
4
5
[deploy-docker@iZqnwheobg66nbZ simcaptcha]$ docker-compose up -d --build
Building with native build. Learn about native build in Compose here: https://docs.docker.com/go/compose-native-build/
Creating network "simcaptcha_simcaptcha-net" with driver "bridge"
ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-f34f4bfebf69 -j RETURN: iptables: No chain/target/match by that name.
(exit status 1))

重启 Docker

1
service docker restart

参考

感谢帮助!