【问题标题】:Point to local dependency from remote base image when building Go program Docker image构建 Go 程序 Docker 镜像时从远程基础镜像指向本地依赖
【发布时间】:2020-06-19 09:05:36
【问题描述】:

请注意,我是 Golang 和 Docker 开发的新手。我已经在别处问过这个问题并尝试阅读文档但找不到任何解决方案。

问题及代码

我有两个 repos /home/experience/keep-ecdsa/home/experience/keep-core,我从 this project 分叉并在本地克隆。

我正在尝试在本地为 keep-ecdsa 构建 docker 映像。这是我的forked repo 的链接。

有一些 keep-core 依赖项,我想指向我本地的 keep-core 存储库。因此,我将go.mod 更改为:

module github.com/keep-network/keep-ecdsa
go 1.13
replace (
    //unrelated stuff...
    github.com/keep-network/keep-core => /home/experience/keep-core
)
require (
    //unrelated stuff...
    github.com/keep-network/keep-core v1.1.3
)

DOCKERFILE 以 (click here to see the full file) 开头:

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 required to support go modules
    GO111MODULE=on
    //rest of the linked DOCKERFILE

运行docker build . 时,我收到以下错误,该错误发生在DOCKERFILERUN go mod download 步骤中。

Step 13/27 : RUN go mod download
--> Running in 88839fc42d4e
go: github.com/keep-network/keep-core@v1.1.3: parsing /home/experience/keep-core/go.mod: open /home/experience/keep-core/go.mod: no such file or directory
The command '/bin/sh -c go mod download' returned a non-zero code: 1

我的尝试和领先

我尝试过:

  • 将我在 DOCKERFILE 中的 GOPATH 更改为各种绝对本地 fs 路径
  • 让我在 DOCKERFILE 中的APPDIR指向我的绝对本地路径/home/experience/keep-ecdsa
  • go.modreplace ( )语句中的路径更改为各种路径(绝对本地,相对于GOPATH

有人给了我这条线索:

您位于golang:1.13.8-alpine3.10 基本映像中 所以里面没有/home/experience/keep-core 因为那只在你本地的 fs 上

但我仍然不知道如何实现我想要的。也许用一些本地基础图像替换 DOCKERFILE 中的FROM ... AS runtine 语句?但是我如何找到这样相关的基础图像,它不会改变其余的 DOCKERFILE 指令吗?

请记住,我将对keep-coredependencies 进行本地更改并且需要对其进行测试,因此包含replace (github.com/mygithubprofile/keep-core) 的解决方案并不令人满意。

提前谢谢你。

【问题讨论】:

  • 不要发布有文字的图片。很难阅读。复制错误并粘贴到
  • @FananDala 现在修复这个问题,抱歉
  • 对不起@FananDala 我们同时编辑了,因为当我点击“保存编辑”时它自动拒绝了你的编辑。感谢您指出这一点。
  • 你能包含完整的案卷文件吗?我想看看RUN go mod download之前还运行了哪些其他Docker指令
  • 当然@FananDala,这里是完整 docker 文件的链接:github.com/jeremyid/keep-ecdsa/blob/master/Dockerfile 我会尽量让我在链接到它的问题中更清楚

标签: docker go dockerfile local


【解决方案1】:

你在 golang:1.13.8-alpine3.10 基础镜像中,所以里面没有 /home/experience/keep-core ,因为它只在你的本地 fs 上

从我在文件中看到的内容来看,您尚未将机器上的 /home/experience/keep-core 目录复制到您的 docker 映像中,因此由于该目录尚不存在而引发错误。

Docker 无法跟踪当前上下文目录之外的链接,因此如果您不想编辑 replace (github.com/mygithubprofile/keep-core),可以将 DockerFile 移动到 /home/experience/ 并使用 COPY 命令从本地复制 keep-core 文件夹机器到 docker 镜像。

RUN mkdir -p /home/experience/keep-core
COPY ./keep-core /home/experience/keep-core

但是,如果您希望 DockerFile 保留在 /home/experience/keep-ecdsa 中,您可以将 keep-core 文件夹移动到 keep-ecdsa 文件夹中并在 .gitignore 文件中忽略它。然后更新

replace (
    //unrelated stuff...
    github.com/keep-network/keep-core => /home/experience/keep-core
)

replace (
    //unrelated stuff...
    github.com/keep-network/keep-core => /home/experience/keep-ecdsa/keep-core
)

【讨论】:

  • 我将 dockerfile 移动到 /home/experience 并在 dockerfile 的第 37 行之后添加了这些说明,现在它会引发另一个错误 COPY go.mod $APP_DIR/ COPY failed: stat /var/lib/docker/tomp/docker-builder763642686/go.mod: no such file or directory。将keep-core 移动到keep-ecdsa 的解决方案并不好,因为这样我将无法将我的更改与keep-core master 分支进行比较并在那里提交
  • @Experience111 将复制命令更新为COPY keep-ecdsa/go.mod $APP_DIR/ 基本上将您的复制命令更新为现在相对于/home/experience
  • 看起来现在正在编译,没有错误。我将等待编译结束,在keep-core 中测试一些更改,看看它们是否反映在我的本地 Docker 映像中,然后报告回来。
  • 我在所有的 COPY 语句中添加了keep-ecdsa,它现在可以工作了。我能够测试一些正确反映在我的 Docker 映像中的本地更改。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2016-12-12
  • 2017-09-29
  • 2020-01-20
  • 2017-12-31
  • 2020-07-24
  • 2023-01-28
相关资源
最近更新 更多