1、项目目录内新建 Dockerfile ,基于 Golang 镜像构建自己的镜像
1 2 3 4 5 6 7 8 9 10 11 12
| FROM golang:latest
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
| sudo usermod -aG docker git
sudo chmod a+rw /var/run/docker.sock
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 mygo:latest
ENV GOPROXY https://goproxy.cn,direct WORKDIR $GOPATH/src COPY . $GOPATH/src
RUN go build -o ./out ./src
EXPOSE 18080 ENTRYPOINT ["./out"]
|