1、项目目录内新建 Dockerfile ,基于 Golang 镜像构建自己的镜像

1
2
3
4
5
6
7
8
9
10
11
12
# 以 Golang 官方镜像为基础镜像
FROM golang:latest

# 设置 GOPROXY 为国内网站,防止编译的时候被墙
ENV GOPROXY https://goproxy.cn,direct
WORKDIR $GOPATH/src
COPY . $GOPATH/src

RUN go build -o ./out ./src

EXPOSE 18080
ENTRYPOINT ["./out"]

2、添加 Git Hooks ,实现推送后自动部署

需给 git 用户添加可执行 docker 命令的权限

1
2
3
4
5
6
# git 用户加入 docker 用户组
sudo usermod -aG docker git
# 修改 docker.sock 的权限 /var/run/docker.sock
sudo chmod a+rw /var/run/docker.sock
# 重启 docker
sudo systemctl restart docker

添加文件 xxx.git/hooks/post-receive ,实现推送后自动部署 docker 镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
APP_NAME=mygo
APP_DIR=/home/git/go
COMPOSE_DIR=/home/git/compose_mygo

GIT_WORK_TREE=$APP_DIR git checkout master -f

cd $APP_DIR
docker build --tag $APP_NAME:latest .
docker stop $APP_NAME
docker rm $APP_NAME
cd $COMPOSE_DIR
docker-compose up -d

在目录 /home/git/compose_mygo 中添加 docker-compose.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
version: "3"

services:
mygo:
image: mygo:latest
container_name: mygo
restart: always
external_links:
- myredis
ports:
- "18080:18080"
myredis:
image: redis:latest
container_name: myredis
restart: always
volumes:
- /var/redis/redis.conf:/usr/local/etc/redis/redis.conf
- /var/redis/data:/data:rw
- /var/redis/logs:/logs
ports:
- "6379:6379"
logging:
options:
max-size: 100m
max-file: 2
environment:
- TZ=Asia/Shanghai
command: redis-server /usr/local/etc/redis/redis.conf

由于 redis 无需远程访问,所以并未设置密码。
完成后添加可执行权限 && 修改文件所属为 git 。

1
2
3
chmod +x xxx.git/hooks/post-receive
chmod -R git:git xxx.git/hooks/post-receive
chmod -R git:git /home/git/compose_mygo

3、优化打包速度

经以上部署后已实现推送代码后自动打包 master 分支并部署镜像。由于每次部署都要重新打包,打包又需要从远端拉取依赖,所以修改 Dockerfile ,以之前构建好的镜像为基础镜像进行构建,减少编译时间。修改后的
Dockerfile 文件内容如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
# FROM golang:latest
# 以上一次编译的镜像为基础镜像
FROM mygo:latest

# 设置GOPROXY为国内网站,防止编译的时候被墙
ENV GOPROXY https://goproxy.cn,direct
WORKDIR $GOPATH/src
COPY . $GOPATH/src

RUN go build -o ./out ./src

EXPOSE 18080
ENTRYPOINT ["./out"]