我正在创建一个Containerfile
从主机接收输入文件夹的地方,其中包含我在容器内需要的文件。
我知道的最好的方法是将其通过类似的卷传递:
-v /host/path:/opt/input
。
但我想/opt/input
以与传递卷名相同的方式从容器的用户中抽象出来:
-v volume-name:/opt/input
。
VOLUME不太像这样工作,但我想要实现的是:
VOLUME ["input-data": "/opt/input"]
因此用户可以这样做:
-v /host/path:input-data
并且如果我有一天需要改变该路径,可以更轻松地改进容器文件而不会破坏兼容性。
还有其他我还没能想到的替代方案吗?
Docker 和 Podman 都无法按照您建议的方式抽象容器路径。
我倾向于将容器端文件系统路径和容器端口视为镜像外部可见接口的一部分。也就是说,右侧
{docker,podman} run -v
和-p
选项是众所周知的固定值。如果您作为镜像作者决定更改这些路径,那么您就是在更改用户需要使用的命令。如果您控制这些路径,我可能会尝试选择一条短而明显的路径,也许
/input
与相反。如果应用程序默认期望其他地方的输入,/opt/input
您可能能够设置ENV
变量或创建符号链接。RUN ln -s
VOLUME
对于您希望挂载外部内容的地方,您不需要 Dockerfile 。此指令有两个作用:当您运行容器时,如果没有其他任何内容挂载在那里,容器运行时会为您创建一个匿名卷;并且未来的RUN
命令无法更改目录。您可以docker run -v
将外部内容挂载在任何容器目录上,无论它是否是 DockerfileVOLUME
。如果您不确定 的任何语义或细节VOLUME
,通常可以安全地完全删除 Dockerfile 指令。