问题描述
在使用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
。