【问题标题】:In Docker, can't cd into directory installed with "go get"?在 Docker 中,不能 cd 进入使用“go get”安装的目录吗?
【发布时间】:2020-02-11 07:53:04
【问题描述】:

我正在尝试构建一个 Docker 容器,该容器下载https://github.com/micromdm/scep 的源代码,并使用go get 命令和cds 到生成的目录中,以便执行一些后续命令(即@987654325 @、make buildCOPY 将相关生成的二进制文件放入容器的 PATH)。

到目前为止,我已经尝试过这个Dockerfile

FROM golang:latest
ENV GO111MODULE on
RUN ["go", "get", "github.com/micromdm/scep"]
RUN cd $GOPATH/src/github.com/micromdm/scep

但是,如果我尝试运行它,我会收到以下错误:

> docker build . --tag loadtest
Sending build context to Docker daemon  4.608kB
Step 1/4 : FROM golang:latest
 ---> 52b59e9ead8e
Step 2/4 : ENV GO111MODULE on
 ---> Using cache
 ---> 28335bf0142b
Step 3/4 : RUN ["go", "get", "github.com/micromdm/scep"]
 ---> Using cache
 ---> 86760bf0c490
Step 4/4 : RUN cd $GOPATH/src/github.com/micromdm/scep
 ---> Running in b86fc3ab0ab8
/bin/sh: 1: cd: can't cd to /go/src/github.com/micromdm/scep
The command '/bin/sh -c cd $GOPATH/src/github.com/micromdm/scep' returned a non-zero code: 2

如果我在没有将GO111MODULE 环境变量设置为on 的情况下尝试该命令,我会收到他的错误:

> docker build . --tag loadtest
Sending build context to Docker daemon  4.608kB
Step 1/3 : FROM golang:latest
 ---> 52b59e9ead8e
Step 2/3 : RUN ["go", "get", "github.com/micromdm/scep"]
 ---> Running in 8cb54311a416
package github.com/micromdm/scep: no Go files in /go/src/github.com/micromdm/scep
The command 'go get github.com/micromdm/scep' returned a non-zero code: 1

https://github.com/ponzu-cms/ponzu/issues/204 之后,我还尝试在末尾使用... 运行它,

FROM golang:latest
RUN ["go", "get", "github.com/micromdm/scep/..."]
RUN cd $GOPATH/src/github.com/micromdm/scep \

但这会导致

> docker build . --tag loadtest
Sending build context to Docker daemon  4.608kB
Step 1/3 : FROM golang:latest
 ---> 52b59e9ead8e
Step 2/3 : RUN ["go", "get", "github.com/micromdm/scep/..."]
 ---> Running in 961bae3bb455
# github.com/micromdm/scep/scep
src/github.com/micromdm/scep/scep/scep.go:318:17: p7.EncryptionAlgorithm undefined (type *pkcs7.PKCS7 has no field or method EncryptionAlgorithm)
src/github.com/micromdm/scep/scep/scep.go:449:26: too many arguments in call to pkcs7.Encrypt
src/github.com/micromdm/scep/scep/scep.go:449:53: undefined: pkcs7.WithEncryptionAlgorithm
src/github.com/micromdm/scep/scep/scep.go:542:26: too many arguments in call to pkcs7.Encrypt
src/github.com/micromdm/scep/scep/scep.go:542:54: undefined: pkcs7.WithEncryptionAlgorithm
The command 'go get github.com/micromdm/scep/...' returned a non-zero code: 2

关于如何实现下载包并将cding 到结果目录的任何想法?

【问题讨论】:

  • 你 cd 进入这个目录的原因是什么?您没有定义 WORKDIR 的任何原因?
  • RUN cd ...anything... 没有做任何有用的事情(除非它是复合命令的一部分;例如,RUN cd ...anything... && do_something_else 可能很有用,因为它将do_something_else 放在anything 目录中,即使它不会更改单独/后续RUN 的工作目录)。每个RUN 命令都发生在一个新的、唯一的shell 中,该shell 不用于其他任何东西,所以cd——它改变了当前shell的状态——没有持久的效果。
  • @CharlesDuffy 谢谢,我知道RUN cd ... 并没有做任何有用的事情,并且在其原始形式中,此命令与&& 和后续命令配对,我只是以这种简化形式保留它仅显示重现错误消息所需的内容。

标签: docker go go-modules go-get


【解决方案1】:

首先,在 docker 中,您正在构建一个容器,因此尝试 cd 进入您电脑中的目录是不可能的。使用 WORKDIR 命令,另外 id 建议将 git clone 到存储库并在那里创建 Dockerfile,然后将其中的所有内容复制到 docker 内的目录中,例如:

COPY . /app
WORKDIR /app/where_you_want_to_cd
RUN whatever_you_want_to_run

【讨论】:

    【解决方案2】:

    您可以将此路径设置为您的WORKDIR,后续命令将很容易。

    docker builder reference 开始,每个 RUN 命令都是独立运行的。所以做RUN cd 对下一个 RUN 命令没有任何影响。

    以下 Dockerfile 有效:

    FROM golang:latest
    
    ENV GO111MODULE on
    RUN go get github.com/micromdm/scep
    WORKDIR /go/src/github.com/micromdm/scep
    

    这里需要GO111MODULE,因为在该模块的go.mod中没有定义go版本,所以你需要自己激活它。

    【讨论】:

      【解决方案3】:

      原来生成的代码不在/go/src,而是在/go/pkg

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-02
        • 2017-08-28
        • 1970-01-01
        • 2015-10-04
        • 1970-01-01
        • 2012-11-27
        相关资源
        最近更新 更多