我目前正在使用 Go 设置 HTTPS 服务器,使用存储在cert.pem
和key.pem
用于开发的自签名签名。每当我在本地运行服务器时,它都能正常工作,允许我连接到我的 HTTPS 服务器。但是,当我构建 Dockerfile 并从那里运行它时,我的浏览器返回此页面:
我一直尝试在 Dockerfile 中使用ADD
和COPY
这两个文件,因为我不确定在构建 Go 项目后它是否被包含在我的 Go 项目中,但每当我尝试构建修改后的 Dockerfile 时,它都会给我一个错误,说它找不到文件。我正在运行的 docker 命令是sudo docker run -p 8080:8080 hxgo-skeleton
。如何将cert.pem
和key.pem
文件添加到我的 Golang Web 服务器的 Dockerfile 中?
Dockerfile
# Build
FROM golang:1.23.3-alpine AS build-env
ENV APP_NAME=hxgo-skeleton
ENV CMD_PATH=cmd/api/main.go
COPY . $GOPATH/src/$APP_NAME
COPY .env $GOPATH/src/$APP_NAME
WORKDIR $GOPATH/src/$APP_NAME
# Building the Go application
RUN CGO_ENABLED=0 go build -v -o /$APP_NAME $GOPATH/src/$APP_NAME/$CMD_PATH
# Run
FROM alpine:3.14
ENV APP_NAME=hxgo-skeleton
COPY --from=build-env /$APP_NAME .
COPY .env .
EXPOSE 8080
CMD ./$APP_NAME
运行容器时,您应该使用 Docker 绑定挂载注入 TLS 证书和私钥。
选项中的第一个路径
-v
是本地系统上 TLS 证书数据所在的目录,第二个路径是容器文件系统中应用程序希望找到它的路径。如果您通过 Docker Compose 运行它,它的volumes:
语法类似,只是它理解左侧的相对路径。不要尝试将 TLS 证书直接嵌入到镜像中。这样做有两个很好的理由。实际上,TLS 证书与特定的 DNS 名称绑定,因此您必须为每个新部署重建镜像,并且您通常希望镜像可以在任何环境中重复使用。从安全角度来看,将文件从容器中复制回来非常容易,因此任何拥有您的镜像副本的人都可以窃取您的私钥。
从机械角度来看,在多阶段构建中,最后
FROM
一行之后,您只有COPY --from=build
应用程序本身和.env
文件。最终镜像中不会有其他任何东西。这意味着您的镜像将不包含 Go 工具链(好),也不包含您的源代码(好),但存储库中可能存在的任何其他支持文件都不会被复制。如果您需要这些文件并且将它们放在镜像中是合适的,则需要单独复制COPY
它们。