每当我使用
-v
将文件系统绑定到 docker 容器时:
sudo docker ... run -v /file/to/host/thing:/container/filepath ...
我的容器对其所做的任何修改都对应
/container/filepath
,都会镜像到主机的文件系统上。这显然是设计使然,也是“安装”的意思。
但是,我想要一种方法,让容器开始,并在
/file/to/host/thing
上复制/container/filepath
,只要更改在容器本身内保持隔离,它就可以修改后者所需的一切。
文件路径的
:ro
后缀使整个容器的文件成为 read-only
。对于我的用例来说,这是不可取的,因为我想修改一些文件。
我怎样才能做到这一点?
容器临时文件系统具有您所描述的写时复制行为,前提是您不在其上安装某些内容。如果您
COPY
将内容放入 Docker 镜像中,则每个容器将从镜像中的内容开始,但如果确实需要写入,则拥有自己独立的副本。
为此,您需要在 Dockerfile 中添加一行
COPY
将内容复制到映像中(与其他 COPY
命令一样,数据必须存在于 Docker 构建上下文中;您不能使用任意主机目录),您需要删除 docker run -v
选项。
另一个重要的警告是,如果您正在构建
FROM
声明 VOLUME
的基础映像,则无法取消 VOLUME
该目录并恢复写时复制行为。例如,在数据库容器的特定情况下,您无法使用预置数据创建数据库映像,并且无法在不更改数据库存储位置的情况下具有非持久的写时复制行为(尽管这对于某些类型来说确实非常有用)集成测试和某些应用程序框架(如 Rails)。