使用Dockerfile发布Go服务
本文章有两种方式发布Go的服务,也可以基于下面的两种方式自行改造成一个Dockerfile,两种方式的原因:
- 开发环境最好是编译发布,这样可以方便排查问题
- 生产环境最好是可执行发布,隔离程序的源代码
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
注意
- go build的时候使用了tag
go build --tags netgo -o go-api
,不知道有没有作用 - 可以利用
.dockerignore
忽略不需要的文件,如:Dockerfile
,start.sh
等
您好,我构建了镜像之后,用docker run启动时候加了数据卷挂载就启动失败,提示是no such file or directory: unknown。请问何解?
期待您的答复,谢谢!
可以挂一下具体的运行指令看一下