在程序开发过程中,公司要求以docker镜像的形式提交版本用于测试,一般都是会有配套的CICD流程,但是本地打包镜像的方式不太适合,所以需要在项目中提供Dockerfile,下面提供一个通用的Dockerfile模版
通用模版
FROM golang:1.19.3-alpine as builder
WORKDIR /app
COPY . .
#这里可以设置一些环境变量,ARG的变量只会在打包的时候起作用,ENV 的环境变量是在运行的环境也起作用
ARG GO111MODULE=on
ARG GOPROXY=https://goproxy.cn,direct
# 如果有私有仓库的
ARG GOINSECURE= abc.com
ARG GONOPROXY=abc.com
ARG GONOSUMDB=abc.com
ARG GOPRIVATE=abc.com
# 安装一些组件
RUN sed -i -e 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk --no-cache add git ca-certificates gcc g++
RUN CGO_ENABLED=1 GOOS=linux && \
go build -o app .
# 为了打包出来的镜像尽量小易于分发,一般都会使用一个基础镜像作为运行环境
FROM alpine:latest as prod
COPY --from=builder /app /app
RUN apk add --no-cache tzdata \
&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone
WORKDIR /app
EXPOSE 8080
ENV MYSQL_ADDR="mysql..."
CMD ["./app"]
如果是在本地打包,也可以执行 docker build -t {name}:{tag} .
可以验证是否正常
运行镜像
镜像打包出来后可以直接运行,除了docker run
的方式外,还可以通过docker-compose.ymal文件的形式更方便日常的使用,下面是一个模版
version: '3' # Docker Compose 文件版本
services:
web:
image: nginx:latest # 使用的镜像
container_name: my-nginx-container # 容器的名称
ports:
- "8080:80" # 端口映射,将主机的 8080 端口映射到容器的 80 端口
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro # 挂载主机上的 nginx.conf 文件到容器内,并设置为只读
environment:
- NGINX_VERSION=1.21.0 # 设置环境变量 NGINX_VERSION
extra_hosts:
- "customdomain:192.168.1.1" # 额外的 hosts 条目
restart: always # 容器退出后总是重新启动
networks:
- my-network # 使用自定义网络 my-network
command: ["nginx", "-g", "daemon off;"] # 覆盖默认启动命令
networks:
my-network: # 定义自定义网络 my-network
driver: bridge # 使用 bridge 网络驱动
volumes:
my-volume: # 定义卷 my-volume
driver: local # 使用本地卷驱动
driver_opts:
type: 'nfs' # 使用 NFS 卷驱动
o: addr=192.168.1.2,rw # NFS 挂载选项
secrets:
my-secret: # 定义密文 my-secret
external: true # 使用外部密文
推送镜像
登录远程仓库
docker login <registry-url>
镜像增加标签
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
推送镜像到远程仓库
docker push myregistry.example.com/myimage:v1