在Docker容器中执行sed命令

5
我正在尝试更改一个位于Docker容器内部的配置文件。
docker exec container_name sed -ire '/URL_BASE = /c\api.myapiurl' tmp/config.ini 

在本地执行此sed命令完全没有问题,但是当我尝试在容器中执行时,会收到以下错误消息。

sed: cannot rename tmp/config.ini: Operation not permitted

我需要做的是在将容器部署到服务器之前,将'config.ini' 中的 'URL_BASE =' 替换掉。 我不知道为什么 sed 命令尝试重命名文件,而这并不应该发生。 有什么想法吗? 我的尝试: 我尝试使用 --privileged 标志执行,但没有起作用。我尝试使用 chmod 改变文件权限,但由于权限问题,我无法实现。
docker exec --privileged container_name sed -ire '/URL_BASE = /c\api.myapiurl' tmp/config.ini 

Result: sed: cannot rename tmp/config.ini: Operation not permitted

Chmod

docker exec --privileged  container_name chmod 755 tmp/config.ini 

Result: chmod: changing permissions of 'tmp/config.ini': Operation not permitted

我之前也尝试过在使用docker命令之前加上sudo,但是也没有成功。


这是替换字符串的正确命令吗?您可以手动执行以下命令进行验证:docker run -it <image> bash,然后执行 sed <...> - n2o
Sed inplace 的工作原理是创建文件的副本,然后用原始文件替换它。你的问题在于你使用管理员权限在容器内创建了该文件,但在后面的部分中切换到了另一个用户。因此,每当你尝试执行 exec 时,你都会以非管理员用户身份输入这些命令。请向我们展示你的 Dockerfile。你可以通过输入以下命令来验证这一点:docker exec container_name whoamidocker exec container_name ls -l tmp/config.ini - Nehal J Wani
2个回答

7

Nehal 绝对正确,sed 会创建一个本地文件,因此您需要采用不同的方法,这在 Linux 上很常见:heredocs

仅从文档中获取前几行,here document 是一种特殊用途的代码块。它使用一种 I/O 重定向形式将命令列表提供给交互程序。

它可以帮助我们执行 docker exec,如下所示:

docker exec -i container_name bash <<EOF
sed -ire '/URL_BASE = /c\api.myapiurl' /tmp/config.ini
grep URL_BASE /tmp/config.ini
# any other command you like
EOF

请注意-t选项,在bash中常用,因为它分配了一个伪TTY,但我们并不真正需要它。 另外,为了安全起见,请始终使用绝对路径,如/tmp/config.ini


0
docker exec -i <container name> sed -i 's/xxx/${yyy}/g' path/filename.yaml

这对我来说是有效的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接