我正在尝试构建一个 Docker 容器,该容器下载 https://github.com/micromdm/scep 源代码并使用go get
命令并将 scd
s到生成的目录中,以便执行一些后续命令(即make deps
、make build
,并将相关的结果二进制文件COPY
到容器的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
关于如何下载包并cd
到生成的目录中的任何想法?
首先,在 docker 中,您正在构建一个容器,因此尝试将 cd 放入 pc 中的目录中是不可能的。使用 WORKDIR 命令,也建议将 git 克隆到存储库中并在那里创建 Dockerfile,然后将其中的所有内容复制到 docker 内部的目录中,例如:
COPY . /app
WORKDIR /app/where_you_want_to_cd
RUN whatever_you_want_to_run
您可以将此路径设置为您的 WORKDIR,后续命令将很容易。
根据 docker 生成器参考,每个 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 版本,因此您需要自己激活它。
事实证明,生成的代码不是位于/go/src
中,而是位于/go/pkg
中。