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
posted @ 2023-03-10 17:00  故知学IT  阅读(610)  评论(0编辑  收藏  举报