像卷一样在Dockerfile中添加绑定挂载

45

我想在Dockerfile中像初始化卷一样添加挂载点,有什么方法实现吗?

4个回答

74
一个 Dockerfile 定义了如何构建一个镜像,而不是如何使用它 - 所以你不能在 Dockerfile 中指定绑定挂载。尝试使用 docker-compose。一个简单的 docker-compose.yml 文件来为你挂载一个目录看起来像这样:
version: '3.1'

services:
  mycontainer:
    image: myimage
    build: .
    volumes:
      - './path/on/docker/host:/path/inside/container'  

build: . 是可选的,如果您通过其他方式构建镜像,则不需要它,但有时将所有操作都放在一起很方便。

使用 docker-compose up -d 命令运行它。


“-d” 不是必需的。 - poige
音量如何应用于Windows机器 - 我是否使用Windows特定路径?(带有Linux容器的Windows) - rdelgado-incinc
3
@poige 实际上,使用-d参数是必需的,以便在容器中启动分离模式...否则它只会锁定您的终端... - Siddharth Seth
@SiddharthSeth,那又怎样?还不需要呢。 - poige

31
除了其他答案所说的内容之外:
由于绑定挂载提供对主机文件系统的访问权限,因此将它们嵌入到镜像中将是巨大的安全风险。例如,考虑一个声称是Web服务器的镜像,但实际上绑定挂载了您的 /etc/passwd 和 /etc/shadow 并将其发送到远程服务器。
或者一个绑定挂载了 /lib/ld-linux.so 并覆盖它,从而破坏了整个系统。
出于这些原因,您不能在Dockerfile中嵌入绑定挂载。同样,在Dockerfile中也不能指定主机端口映射、主机设备访问或任何类似的属性。

13

简单回答是不可以。

Docker镜像的基本设计原则是可移植性。绑定挂载是主机特定的,因为挂载的文件夹在主机上定义。因此,这与Docker镜像的可移植性要求相矛盾。


0
我相信你可以在构建时使用绑定挂载 https://docs.docker.com/engine/reference/builder/#run---mounttypebind
示例 Dockerfile:
FROM ubuntu:22.04

RUN --mount=type=bind,source=.,target=/test ls -al /test

在同一个文件夹中运行它。
docker buildx build . --progress plain --no-cache

将输出这个

#6 0.305 drwxr-xr-x 2 root root 4096 Oct  1 16:33 .
#6 0.305 drwxr-xr-x 1 root root 4096 Oct  1 16:33 ..
#6 0.305 -rw-r--r-- 1 root root   76 Oct  1 16:33 Dockerfile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接