如何在Golang Web服务器Dockerfile中添加cert.pem与key.pem文件?
解决Docker容器中Go HTTPS服务器证书缺失问题
核心问题
你的Docker镜像最终运行阶段(alpine镜像)未包含cert.pem和key.pem文件,导致容器内的Go程序找不到证书,无法正常启动HTTPS服务。
修改后的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 # 构建Go应用 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 . # 复制自签名证书到容器工作目录 COPY cert.pem key.pem . EXPOSE 8080 CMD ./$APP_NAME
关键注意事项
- 证书路径匹配:确保Go代码中加载证书的路径和容器内路径一致。如果代码使用相对路径
./cert.pem和./key.pem,上述修改会将证书放在与二进制文件同一目录,无需调整代码。 - 文件位置检查:确认
cert.pem和key.pem与Dockerfile在同一目录下,否则需调整COPY指令的源路径(比如./certs/cert.pem)。 - .dockerignore排查:检查项目根目录的
.dockerignore文件,确保未排除.pem后缀文件,否则COPY指令会跳过这些文件。 - 重新构建镜像:修改Dockerfile后,需重新构建镜像才能生效:
sudo docker build -t hxgo-skeleton .
备选方案(从构建阶段复制)
如果证书已在构建阶段被复制到build-env镜像的项目目录中,也可直接从构建阶段复制到运行镜像,避免重复复制本地文件:
# Run阶段替换COPY证书的部分 COPY --from=build-env $GOPATH/src/$APP_NAME/cert.pem . COPY --from=build-env $GOPATH/src/$APP_NAME/key.pem .
内容的提问来源于stack exchange,提问作者bascott
相关产品推荐
相关产品推荐

