我正在研究可以在 docker 容器中設定一些引數的自動化腳本。我想用容器中的 yaml 檔案替換路徑,所以我使用以下命令path.repo: /var/backups:path.repo: /var/log/elasticsearch
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.*)/\1\2\/var\/log\/elasticsearch\3/' /etc/elasticsearch/elasticsearch.yml
他們都沒有作業。當我登錄 docker 容器并打開 yml 檔案時,它仍然保持不變。我是不是用 docker 命令做錯了什么?我也試過:
perl -i -p -e's{"/var/backups"}{/var/log/elasticsearch' /etc/elasticsearch/elasticsearch.yml
提前致謝
uj5u.com熱心網友回復:
您第一次嘗試的一個問題是,在本地 shell 中設定變數不會將它們暴露在 docker 容器中(并且在引數周圍使用單引號會阻止本地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
這幾乎相當于你的第一個例子。
話雖如此,在正在運行的容器中編輯內容通常被認為是一種反模式:您最好的做法幾乎總是生成一個新影像,其中使用適當的Dockerfile.
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/425540.html
下一篇:為什么這些值有時未定義?
