Skip to content

docker 部署 Go Web 程序 ​

本轮只做理论正文与源码静态复核;下列命令、示例和测试均未执行。已有输出按代码推演或历史记录理解,不作为本轮运行证据。

完整文件与原片段边界 ​

末尾保留的 Dockerfile 是 2020 年历史单阶段片段,[root@demo-host ...]# 是终端提示符,不能写进文件;原文没有提供 main.go/go.mod,不能据目录树认定工程完整。EXPOSE 不发布端口,CGO_ENABLED=0 也不能保证任意依赖能禁用CGO。以下是与课程一致的 Go 1.27.2 标准库教学示例,3个文件放同一独立目录,未构建、未拉取镜像、未运行:

go.mod:

text
module example.com/local-health
go 1.27.0

main.go:

go
package main

import (
    "log"
    "net/http"
    "time"
)

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("GET /health", func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Content-Type", "text/plain; charset=utf-8")
        _, _ = w.Write([]byte("ok\n"))
    })
    srv := &http.Server{Addr: ":8888", Handler: mux, ReadHeaderTimeout: 5*time.Second}
    log.Fatal(srv.ListenAndServe())
}

Dockerfile:

dockerfile
FROM golang:1.27.2 AS build
WORKDIR /src
COPY go.mod main.go ./
RUN CGO_ENABLED=0 go build -o /app .
FROM scratch
COPY --from=build /app /app
USER 65532:65532
EXPOSE 8888
ENTRYPOINT ["/app"]

在上述三个文件所在的独立目录,未来可按下面顺序构建、启动、请求和清理;本次未执行:

sh
docker build -t local-health:lesson .
docker run -d --name local-health-lesson -p 127.0.0.1:18888:8888 local-health:lesson
curl -i http://127.0.0.1:18888/health
docker logs local-health-lesson
docker stop local-health-lesson
docker rm local-health-lesson
docker image rm local-health:lesson

理论步骤是在该目录以当前目录为构建上下文、标记专用镜像,再显式映射 127.0.0.1:18888:8888。预期 GET /health 返回200和三个字节 ok加换行;其他路径404。此示例不访问HTTPS或时区数据库,scratch没有Shell、CA证书或时区文件;不能直接套到需要这些文件的业务应用。固定tag是教学选择,未核验远程digest,不声称镜像身份不可变。书面练习先画清主机18888到容器8888的映射,再解释为何EXPOSE本身不等于可访问。

2020 年原始 Dockerfile 与终端记录

docker 部署 Go Web 程序 ​

http ​

shell
[root@demo-host dockerFile]# tree
.
├── Dockerfile
├── go.mod
└── main.go
dockerfile
[root@demo-host dockerFile]# cat Dockerfile
FROM golang:alpine

# 为我们的镜像设置必要的环境变量
ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64

# 移动到工作目录:/build
WORKDIR /build

# 将代码复制到容器中
COPY . .

# 将我们的代码编译成二进制可执行文件app
RUN go build -o app .

# 移动到用于存放生成的二进制文件的 /dist 目录
WORKDIR /dist

# 将二进制文件从 /build 目录复制到这里
RUN cp /build/app .

# 声明服务端口
EXPOSE 8888

# 启动容器时运行的命令
CMD ["/dist/app"]

继续阅读