В Docker, не может CD в каталог, установленный с «Go Get»? - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь создать контейнер Docker, который загружает источник https://github.com/micromdm/scep и использует команду go get и cd 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 IN в результирующий каталог?

Ответы [ 3 ]

2 голосов
/ 14 октября 2019

Прежде всего, в Docker вы создаете контейнер, поэтому попытаться перейти в каталог на вашем компьютере не представляется возможным. Используйте команду WORKDIR, также id recomend, чтобы добавить git clone в репозиторий и создать Dockerfile, а затем скопировать все содержимое в каталог внутри докера, например:

COPY . /app
WORKDIR /app/where_you_want_to_cd
RUN whatever_you_want_to_run
1 голос
/ 14 октября 2019

Получается, что полученный код находится не в /go/src, а в /go/pkg.

1 голос
/ 14 октября 2019

Вы можете установить этот путь в качестве WORKDIR, и последующая команда будет легкой.

Из справочника построителя докеров каждая команда 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, поэтому вам нужно активировать егосами.

...