Docker run--装载—在运行期间使所有文件在不同的文件夹中可用

Docker run--装载—在运行期间使所有文件在不同的文件夹中可用,docker,dockerfile,docker-buildkit,Docker,Dockerfile,Docker Buildkit,我想在执行RUN语句期间使主机上的文件夹可用。也就是说,与使用-v运行容器的效果类似: docker run -v /path/on/host:/path/in/container mycontainer:tag 在容器中,这将为我提供/path/In/container,其中包含路径/on/host中的所有文件/文件夹 为此,我正在尝试以下实验性安装选项: 在运行期间,这将为我提供一个文件夹/path/on/host 我有两个问题: 我可以ls文件在/path/on/host中,但不能使用它

我想在执行
RUN
语句期间使主机上的文件夹可用。也就是说,与使用
-v
运行容器的效果类似:

docker run -v /path/on/host:/path/in/container mycontainer:tag
在容器中,这将为我提供
/path/In/container
,其中包含
路径/on/host
中的所有文件/文件夹

为此,我正在尝试以下实验性安装选项:

运行期间,这将为我提供一个文件夹
/path/on/host

我有两个问题:

  • 我可以
    ls
    文件在
    /path/on/host
    中,但不能使用它们(例如
    cat
    它们)。我曾尝试将
    类型
    更改为例如
    缓存
    ,并像中一样使用
    源代码
    ,但无法使其正常工作

  • 我不知道如何在“
    运行
    映像”中使用不同的路径,即
    /path/in/container
    而不是
    /path/on/host


  • 我认为您误解了RUN--mount=type=bind…
    语法的含义。从文件中:

    此装载类型允许将上下文或映像中的目录(只读)绑定到生成容器

    换句话说,这不允许您在构建阶段访问任意主机目录。它与
    docker run
    上的
    -v
    命令行选项不同。它只允许您:

    • 从生成上下文装入目录,或
    • 在多阶段生成中从另一阶段装载目录
    例如,我可以将目录从一个构建阶段装载到下一个构建阶段:

    # syntax=docker/dockerfile:experimental
    
    FROM centos AS centos
    
    FROM alpine
    RUN --mount=type=bind,from=centos,source=/,target=/centos ls /centos > /root/centos.txt
    
    或者,如果我在构建上下文中有一个名为
    example
    的目录,我可以在构建过程中执行以下操作来装载它:

    # syntax=docker/dockerfile:experimental
    
    FROM centos AS centos
    
    FROM alpine
    RUN --mount=type=bind,source=example,target=/data cp /data/* /root/
    
    您正在使用的语法(未指定来自的

    …只需在容器内的
    /path/on/host
    上装载构建上下文的根。请记住,
    target
    指定容器内的装入点。例如,如果我的构建上下文如下所示:

    .
    ├── Dockerfile
    └── example
        └── README.md
    
    example/README.md
    包含:

    This is a test.
    
    Dockerfile
    包含一个
    RUN
    选项,与您正在使用的类似:

    # syntax=docker/dockerfile:experimental
    
    FROM centos AS centos
    
    FROM alpine
    RUN --mount=type=bind,target=/data cat /data/example/README.md > /root/README.md
    

    然后在构建映像时,
    /root/README.md
    包含
    example/README.md

    您是对的--我误解了文档。谢谢你的澄清!我想没有办法完成我正在寻找的挂载吗?您好,非常感谢您澄清功能和文档!在我的例子中,我的
    源代码有问题,我没有找到与上下文相关的源代码,因此我得到
    无法计算缓存键:“/Users/bric3/opensource/panama foreign”not found:not found
    。顺便说一下,
    #syntax=docker/dockerfile:experimental
    在最近的docker版本中不再是必需的。
    This is a test.
    
    # syntax=docker/dockerfile:experimental
    
    FROM centos AS centos
    
    FROM alpine
    RUN --mount=type=bind,target=/data cat /data/example/README.md > /root/README.md