【问题标题】:Exec sed command to a docker container对 docker 容器执行 sed 命令
【发布时间】:2017-01-07 06:32:27
【问题描述】:

我正在尝试更改 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

修改

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 <...>
  • Sed inplace 通过创建文件的副本然后将其替换为原始文件来工作。您的问题是您在具有管理员权限的容器内创建了文件,但在后面部分转移给了另一个用户。因此,每当您尝试执行 exec 时,您都是以非管理员用户身份输入这些命令。向我们展示您的 Dockerfile。您可以通过键入以下内容来验证这一点:docker exec container_name whoamidocker exec container_name ls -l tmp/config.ini

标签: bash docker sed


【解决方案1】:

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

仅从文档的第一行来看,此处的文档是一个特殊用途的代码块。它使用一种 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 2015-10-21
    • 2023-01-28
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多