如何用 perl 或 sed 替换 docker 容器中的文件路径

How to replace path in file in docker container with perl or sed

我正在开发可以在 docker 容器中设置一些参数的自动化脚本。我想在容器中的 yaml 文件中用 path.repo: /var/log/elasticsearch 替换路径 path.repo: /var/backups,所以我使用以下命令:

old_path=/var/backups
new_path=/var/log/elasticsearch

docker exec elk sed -i '0,/${old_path}/s//${new_path}/' /etc/elasticsearch/elasticsearch.yml 

docker exec elk sed -i -E 's/^([^ ]*\s+)(\/var\/backups)(\s.*)/\/var\/log\/elasticsearch/' /etc/elasticsearch/elasticsearch.yml

None 个正在运行。当我登录 docker 容器并打开 yml 文件时,它仍然保持不变。我是不是用 docker 命令做错了什么? 我也试过:

perl -i -p -e's{"/var/backups"}{/var/log/elasticsearch' /etc/elasticsearch/elasticsearch.yml

提前致谢

您第一次尝试的一个问题是,在您的本地 shell 中设置变量不会将它们暴露在您的 docker 容器中(并且在您的参数周围使用单引号会阻止您的 local shell 从扩展它们)......即使你要替换该表达式中的变量值,路径中的 / 字符也会与你的 sed 命令。这里最简单的解决方案可能是这样的:

docker exec elk sed -i 's|/var/backups|/var/log/elasticsearch|' /etc/elasticsearch/elasticsearch.yml 

请注意使用 | 而不是 / 作为 sed 表达式分隔符以避免与路径分隔符发生冲突。这仅适用于 s 命令,因此如果您确实需要使用搜索表达式限制这些更改的范围,您将需要类似以下内容:

docker exec elk sed -i '0,/\/var\/backups/ s|/var/backups|/var/log/elasticsearch|' /etc/elasticsearch/elasticsearch.yml 

这几乎等同于您的第一个示例。

话虽如此,在 运行 容器内编辑内容通常被认为是 anti-pattern:您最好的做法几乎总是通过使用合适的Dockerfile.