使用Dockerfile发布Go服务

@hanq  2022年06月15日 13:43

使用Dockerfile发布Go服务

本文章有两种方式发布Go的服务,也可以基于下面的两种方式自行改造成一个Dockerfile,两种方式的原因:

  1. 开发环境最好是编译发布,这样可以方便排查问题
  2. 生产环境最好是可执行发布,隔离程序的源代码

0. 环境参数

  • 编译环境: CentOS 7.9
  • Golang版本: 1.18

1. 编译发布

# 基于golang 1.18
FROM golang:1.18
# 设置环境变量
ENV GO118MODULE=on \
CGO_ENABLED=0\
GOOS=linux \
GOARCH=amd64 \
GOPROXY="https://goproxy.cn,direct"
# 定义代码路径
WORKDIR /app
# 复制代码
COPY . .
# 编译二进制文件,可执行文件为:app
RUN go build -o go-api .
# 设置时区为上海
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
# 设置编码
ENV LANG C.UTF-8
# 服务器端口
EXPOSE 6011
# 启动容器时运行的命令
CMD ["./go-api"]

2. 可执行发布

# 依赖于mini-docker
FROM docker.io/alpine:latest
# [2] 创建运行需要的库
RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2
# [3] 定义代码路径
WORKDIR /app
# [3] 复制可执行文件
COPY . .
# 设置时区为上海
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
# 设置编码
ENV LANG C.UTF-8
# 服务器端口
EXPOSE 6011
# 启动容器时运行的命令
CMD ["./go-api"]

3. 构建指令

DOCKER_NAME='go-api-dist'
docker build -t $DOCKER_NAME:latest .
# 测试用指令 运行完后自己会删掉
# docker run -it --rm --name $DOCKER_NAME -d -p 12800:6011 $DOCKER_NAME:latest
# 实际运行用的指令
docker run --name $DOCKER_NAME -d -p 12800:6011 $DOCKER_NAME:latest

或使用sh脚本

#!/bin/bash
DOCKER_NAME='go-api-dist'
docker stop $DOCKER_NAME
docker rm $DOCKER_NAME
docker build -t $DOCKER_NAME:latest .
docker run --name $DOCKER_NAME -d -p 12800:6011 $DOCKER_NAME:latest

注意

  1. go build的时候使用了tag go build --tags netgo -o go-api,不知道有没有作用
  2. 可以利用.dockerignore忽略不需要的文件,如:Dockerfile,start.sh

附录


添加新评论

  1. luohaiqingZMM

    您好,我构建了镜像之后,用docker run启动时候加了数据卷挂载就启动失败,提示是no such file or directory: unknown。请问何解?
    期待您的答复,谢谢!

    Reply
    1. @luohaiqingZMM

      可以挂一下具体的运行指令看一下

      Reply