之前有一个问题(Docker Unknown flag--mount)面临着相同的错误,这是由于Docker的运行版本已过时。我有一个最新版本的Docker正在运行。
我有以下 Dockerfile
:
FROM continuumio/miniconda3
RUN --mount=type=ssh pip install git+ssh://git@github.com/myrepo/myproject.git@develop
RUN conda install numpy
...
根据文档,我应该能够简单地运行< code>docker build - ssh default。。但是,我收到以下错误:
Sending build context to Docker daemon 2.048kB
Error response from daemon: Dockerfile parse error line 3: Unknown flag: mount
< code>docker版本的输出:
Client: Docker Engine - Community
Version: 18.09.2
API version: 1.39
Go version: go1.10.8
Git commit: 6247962
Built: Sun Feb 10 04:12:39 2019
OS/Arch: darwin/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.2
API version: 1.39 (minimum version 1.12)
Go version: go1.10.6
Git commit: 6247962
Built: Sun Feb 10 04:13:06 2019
OS/Arch: linux/amd64
Experimental: true
我想在不暴露我的私有SSH凭证的情况下构建一个Docker映像,这似乎是受支持的方法。有人知道是什么导致了这个问题吗?
Dockerfile文件
# syntax=docker/dockerfile:experimental
FROM continuumio/miniconda3
RUN --mount=type=ssh pip install git+ssh://git@github.com/myrepo/myproject.git@develop
RUN conda install numpy
...
注意:第一行的注释是必需的 巫毒教
然后使用以下命令构建您的docker映像:
DOCKER_BUILDKIT=1 docker build --ssh default -t my_image .
这样,您就可以在 Dockerfile 中使用 RUN
指令的 --mount
选项。
正如在这里的文档中所发现的,构建docker映像时的ssh转发仅在使用BuildKit后端时启用:
此功能仅在使用BuildKit后端时可用。
Docker build支持实验性特性,如缓存装载、构建秘密和ssh转发,这些特性是通过使用带有语法指令的构建器的外部实现来实现的。要了解这些特性,请参考BuildKit repository中的文档。
为此,您需要 Docker 18.09(或更高版本),并且还需要使用 DOCKER_BUILDKIT=1
环境变量运行 docker build 命令,并使用以下魔术注释启动 Docker 文件:# syntax=docker/dockerfile:experimental
。
您还可以编辑< code >/etc/docker/daemon . JSON 并添加:
{
"experimental" : false,
"debug" : true,
"features": {
"buildkit" : true
}
}
如果您对docker命令使用sudo
,您可能需要:
sudo DOCKER_BUILDKIT=1代码>
对于可能遇到这种错误的人来说:确保文件的第一行是“#syntax=docker/dockerfile:experimental”。这将起作用:
# syntax=docker/dockerfile:experimental
FROM golang:1.14.1 as builder
...
RUN --mount=type=ssh GOSUMDB=off go get -d -v ./...
但是,如果您在文件的开头添加一个注释,如下所示:
# SOME SILLY COMMENT HERE <--- this ostensibly innocent comment ruins everything!
# syntax=docker/dockerfile:experimental
FROM golang:1.14.1 as builder
...
RUN --mount=type=ssh GOSUMDB=off go get -d -v ./...
然后“语法=...”不会被考虑在内,因为它不再在第一线。这就是为什么你在下面得到关于“mount”的奇怪错误!嘎!
希望这能从一些人的生活中节省几个小时。