对 docker 容器执行 sed 命令

Eri*_*ani 3 bash sed docker

我正在尝试更改 docker 容器内的配置文件。

docker exec container_name sed -ire '/URL_BASE = /c\api.myapiurl' tmp/config.ini 
Run Code Online (Sandbox Code Playgroud)

在本地执行此 sed 命令工作正常,但是当我尝试在容器中执行此命令时,我收到以下错误消息。

sed: cannot rename tmp/config.ini: Operation not permitted
Run Code Online (Sandbox Code Playgroud)

我需要做的是更换“URL_BASE =”“config.ini文件”之前部署容器到我的服务器。

我不知道为什么 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
Run Code Online (Sandbox Code Playgroud)

修改器

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

Result: chmod: changing permissions of 'tmp/config.ini': Operation not permitted
Run Code Online (Sandbox Code Playgroud)

我也试过在 docker 之前用 sudo 执行,但也没有用。

nns*_*nse 6

Nehal是绝对正确的, sed 可以创建本地文件,因此您只需要一种不同的方法,这在 Linux 上常用:heredocs

仅从文档的第一行开始,here 文档是一个特殊用途的代码块。它使用一种 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
Run Code Online (Sandbox Code Playgroud)

请注意 -t,它在运行 bash 时常用,因为它分配了一个伪 TTY,而我们实际上并不需要它。此外,为了安全起见,始终使用绝对路径,如/tmp/config.ini.