如何用 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
.
我正在开发可以在 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
.