Docker绑定挂载路径中如何转义引号和逗号

91次阅读
没有评论

问题描述

在使用Docker的绑定挂载路径时,有一个需求是如何在使用--mount语法时转义路径中的引号和逗号。用户注意到Docker文档中鼓励使用--mount而不是-v,但对于-v的情况,用户也有类似的问题,即如何转义路径中的冒号。
用户提供了一个示例:

cd /Users/namemkdir te,\"sttouch te,\"st/file.txtdocker run -it --rm --mount 'type=bind,source=/Users/name/te??st,target=/usr/test' alpine ash

其中??需要是上面创建的te,"st目录中的逗号和双引号。
用户尝试了几种方法,但都没有成功:
1. 使用双引号将source=后面的值括起来,但是出现了错误bare " in non-quoted-field。用户尝试这个方法是基于Docker存储卷文档中的信息框”Escape values from outer CSV parser”,但是这个字段明显不喜欢双引号。
2. 使用单引号、双逗号和反斜杠在卷路径中似乎不起作用,出现了错误invalid field 'st' must be a key=value pair
用户想知道是否有可能使用包含逗号或双引号的路径或卷名,或者是否可以指示Docker使用环境变量来进行环境变量扩展而不是使用shell。
或者,用户是否需要使用compose.yaml文件来绕过这个限制,以便可以使用不同的编码/格式来表示挂载的部分/组件。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

如果你有一个名为te,"st的目录,使用-v命令非常简单:只需将其用引号括起来,注意如果在双引号内有双引号,需要对其进行转义。所以这样可以工作:

$ mkdir te,\"st
$ touch te,\"st/file1
$ docker run --rm -v "$PWD/te,\"st:/data" alpine ls /data/file1

对于--mount,稍微复杂一些。根据https://github.com/docker/cli/issues/1480的信息,我们知道--mount的参数是使用CSV语法解析的,因此我们可以使用典型的CSV转义来处理这些问题(引用包含逗号的字段,并使用双引号转义引号("")):

$ docker run --rm --mount "type=bind,\"src=$PWD/te,\"\"st\",target=/data" alpine ls /data/file1

方案2

使用脚本或工具来管理容器的启动顺序可能会增加复杂性,并且需要确保容器A和容器B之间的依赖关系正确设置。
另一种方法是编写脚本或使用工具来控制容器的运行顺序。你可以使用docker run命令来手动控制容器的启动顺序,或者使用一些第三方工具来管理容器的依赖关系。

示例:

以下是一个简单的bash脚本示例,可以在容器A启动后启动容器B:

#!/bin/bash
# 启动容器A
docker run -d --name container_a your_image_a
# 等待容器A完全启动
while ! docker exec container_a echo "Container A is ready"; do
  sleep 1
done
# 启动容器B
docker run -d --name container_b your_image_b

在这个示例中,我们首先使用docker run命令启动容器A,并将其命名为container_a。然后,使用一个循环来等待容器A完全启动(这里是通过在容器内运行echo命令来测试)。一旦容器A就绪,我们再使用docker run命令启动容器B,并将其命名为container_b

正文完