Golang项目使用Dockerfile部署
前言
关于在构建golang编写的web项目中使用dockerfile的一些总结。
通过查阅资料后,写下了如下配置:
一般模式
会安装golang编译环境,镜像文件包会比较大。
# 构建golang运行环境 使用别名:builder
FROM golang:1.19 as builder
# 设置环境变量
ENV HOME /app
ENV CGO_ENABLED 0
ENV GOOS linux
# 设置工作目录 - 我们所有的文件都存放在工作目录中
# 目前来说:COPY go.mod go.sum ./ && COPY . .
# golang的docker环境中会出现:
## /app/build/Dockerfile
## /app/cmd/demo/main.go
## /app/go.mod
## /app/README.MD
WORKDIR /app
COPY . .
# 下载依赖
RUN go mod download
# 编译app
RUN go build -v -a -installsuffix cgo -o demo cmd/demo/main.go
FROM alpine:latest
RUN apk --no-cache add ca-certificates
# 设置工作目录
WORKDIR /bin/
# 将上个容器编译的二进制文件复制到 工作目录
# 也就是:copy golang环境/工作目录/demo alpine环境/工作目录
COPY --from=builder /app/demo .
# 所以这里执行的命令是:/bin/demo
ENTRYPOINT ["/bin/demo"]
极简模式(运行时可能出现 no found 的错误)
直接将编辑后的文件放入容器中,[alpine]镜像是一个非常小的环境。
FROM alpine:latest
# 在容器根目录 创建一个 apps 目录
WORKDIR /apps
COPY cmd/demo/demo /apps/demo
# 设置时区为上海
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
# 设置编码
ENV LANG C.UTF-8
# 创建软链接
RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2
# 暴露端口
EXPOSE 8080
# 运行golang程序的命令
ENTRYPOINT ["/apps/demo"]
代码
结构
- cmd/demo/main.go
- build/Dockerfile
代码
-
main.go
package main import ( "log" "net/http" "time" ) func main() { s := &http.Server{ Addr: ":8080", Handler: demoServer{}, ReadTimeout: 10 * time.Second, WriteTimeout: 10 * time.Second, MaxHeaderBytes: 1 << 20, } log.Fatal(s.ListenAndServe()) } type demoServer struct{} func (s demoServer) ServeHTTP(r http.ResponseWriter, w *http.Request) { r.Write([]byte("hello world")) }
-
Dockerfile
FROM alpine:latest # 在容器根目录 创建一个 apps 目录 WORKDIR /bin COPY cmd/demo/demo /bin/golang_app # 设置时区为上海 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime RUN echo 'Asia/Shanghai' >/etc/timezone # 设置编码 ENV LANG C.UTF-8 # 创建软链接 RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2 # 暴露端口 EXPOSE 8080 # 运行golang程序的命令 ENTRYPOINT ["/bin/golang_app"]
构建&&运行
# 在项目根目录执行,也就是cmd、build的同级目录下;
## 构建
docker build -t demo:v1 -f ./build/Dockerfile .
## 运行
docker run --rm -itd -p 8118:8080 demo:v1
## 浏览器访问 http://localhost:8118/ 出现 hello world表明部署成功
备注
进入
alpine
容器方法:docker exec -it xxxx容器idxxxx /bin/sh
注意事项
如果打包成功,但是运行时出现找不到文件,那么很有可能是出现缺失库文件。
Alpine使用的c库使用mini版的musl libc与其他Linux发行版使用的gnu libc不一样。虽说号称兼容,但也只是部分兼容了,缺啥补啥就是,通过一个软链接来关联。
## 创建软链接
mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2