Docker Compose中$符号转义失效问题求助
Docker Compose中setup服务sed命令$符号丢失的问题及解决
问题根源
你当前的配置存在引号嵌套冲突:外层/bin/sh -c '...'用单引号包裹脚本内容,而内部sed命令的替换表达式又使用了单引号,这会导致shell解析时提前闭合外层单引号,使得sed的参数被错误截断,最终$符号无法正确传递到sed命令中。同时YAML的>折叠换行语法结合嵌套单引号后,进一步打乱了命令的解析逻辑。
可行解决方案
方案1:改用双引号包裹sed替换表达式
调整sed的引号类型,避免和外层单引号冲突,同时保留$$转义让Docker Compose解析为单个$:
services: setup: image: image:tag container_name: setup user: "0" command: > /bin/sh -c ' sed -i "s/before with a $$/after with a $$/" /foo/bar/something.txt; '
方案2:使用命令数组形式(推荐)
用数组定义command,避免shell解析的引号嵌套问题,YAML不会自动转义$,直接传递给sed:
services: setup: image: image:tag container_name: setup user: "0" command: - /bin/sh - -c - | sed -i 's/before with a $/after with a $/' /foo/bar/something.txt
方案3:转义内部单引号
如果必须用单引号包裹sed替换表达式,可通过'\''转义内部单引号,确保shell正确解析:
services: setup: image: image:tag container_name: setup user: "0" command: > /bin/sh -c ' sed -i '\''s/before with a $$/after with a $$/'\'' /foo/bar/something.txt; '
内容的提问来源于stack exchange,提问作者Vincent LE ROUX
相关产品推荐
相关产品推荐

