提问者:小点点

来自守护程序的错误响应:Dockerfile 解析错误未知标志:装载


之前有一个问题(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映像,这似乎是受支持的方法。有人知道是什么导致了这个问题吗?


共3个答案

匿名用户

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”的奇怪错误!嘎!

希望这能从一些人的生活中节省几个小时。