在程序开发过程中,公司要求以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