构建Go程序Docker镜像时指向本地依赖的问题求助
解决Docker构建时本地Go模块依赖的问题
你的问题核心在于Docker容器是完全隔离的环境——宿主机上的/home/experience/keep-core路径在容器内部根本不存在,这就是go mod download报错找不到文件的原因。要实现本地依赖替换,你需要把本地的keep-core仓库复制到Docker构建上下文里,让容器能访问到它,再调整依赖指向。
下面是具体的解决方案:
步骤1:调整Dockerfile,复制本地依赖到容器内
在gobuild阶段,添加COPY命令把本地的keep-core和keep-ecdsa代码都复制到容器的GOPATH对应路径下。修改后的Dockerfile片段如下:
FROM golang:1.13.8-alpine3.10 AS runtime ENV APP_NAME=keep-ecdsa \ BIN_PATH=/usr/local/bin FROM runtime AS gobuild ENV GOPATH=/go \ GOBIN=/go/bin \ APP_NAME=keep-ecdsa \ APP_DIR=/go/src/github.com/keep-network/keep-ecdsa \ BIN_PATH=/usr/local/bin \ GO111MODULE=on # 复制本地keep-ecdsa代码到容器内的模块目录 COPY . ${APP_DIR} # 复制本地keep-core到容器内对应的模块路径(和go.mod里的模块名对应) COPY ../keep-core /go/src/github.com/keep-network/keep-core # 切换到项目目录执行构建命令 WORKDIR ${APP_DIR} RUN go mod download # 剩余构建步骤...
注意:如果
keep-core不在keep-ecdsa的同级目录,你需要调整COPY的源路径,并且执行docker build时要把构建上下文指定为包含两个仓库的上级目录,比如:docker build -f ./keep-ecdsa/Dockerfile /home/experience这样Docker才能访问到同级的
keep-core目录。
步骤2:调整go.mod的replace指向容器内的路径
修改keep-ecdsa的go.mod,把replace语句改成容器内的相对路径(因为两个模块在容器内是同级的):
module github.com/keep-network/keep-ecdsa go 1.13 replace ( // 无关内容... github.com/keep-network/keep-core => ./../keep-core ) require ( // 无关内容... github.com/keep-network/keep-core v1.1.3 )
为什么之前的修改无效?
你之前调整GOPATH、APP_DIR或者replace的路径形式都没用,因为容器内根本没有/home/experience/keep-core这个目录——Docker默认不会把宿主机的文件自动挂载到容器里,必须显式用COPY或者ADD命令把需要的文件复制到构建环境中。
这样修改后,go mod download就能在容器内找到本地的keep-core模块,你也可以随时修改本地的keep-core代码,重新构建镜像就能测试修改效果了。
内容的提问来源于stack exchange,提问作者Experience111
相关产品推荐
相关产品推荐

