【问题标题】:How to .bashrc for root in Docker如何在 Docker 中为 root 使用 .bashrc
【发布时间】:2016-09-14 01:23:30
【问题描述】:

我想为 (centos:6) Docker 容器中的根用户提供.bashrc。但是,当我运行我的容器时,我发现 .bashrc 没有被采购。这个可以吗?

我的构建命令:

...
RUN touch .bashrc
RUN echo "iptables -t nat -A OUTPUT -d hostA -p tcp --dport 3306 -j DNAT --to hostB" >> .bashrc
...

我的运行命令:

docker run -it --cap-add=NET_ADMIN myImage /bin/bash

【问题讨论】:

  • 尝试将您的 2 个命令放在由 ; 分隔的 CMD 中并重建 /relaunch
  • 所以,如果我这样做并在没有运行命令的/bin/bash 部分的情况下运行它,它会运行但不会给我容器的交互控制。
  • 我的意思是,当你的新镜像建立后,docker run -it --cap-add=NET_ADMIN mynewimage /bin/bash
  • @user2915097 导致 CMD 在被替换后无法执行。
  • 用 ENTRYPOINT 替换 CMD 并重建

标签: docker .bash-profile


【解决方案1】:

bash manpage 声明 .bashrc 在 shell 交互时被读取。因此,如果您想要一个读取 .bashrc 的 bash,您需要使用 -i 启动 bash。

看到:

root@host:~# echo 'echo this is .bashrc' > /tmp/bashrc
root@host:~# docker run -ti -v /tmp/bashrc:/root/.bashrc debian bash -i 
this is .bashrc
root@01da3a7e9594:/#

但是,像这样在容器中执行 bash -i 会覆盖入口点或 cmd,因此最好将 iptables 命令和最初使用的入口点包装在成为入口点/cmd 的 shell 脚本中。

【讨论】:

  • 我发现这个答案是这个问题的正确答案。当我们在没有设置 ENV 的情况下启动容器时。无论是否为 root,它都不会获取 bashrc。设置BASH_ENV 可能是正确的方法。
【解决方案2】:

原来我错误地添加了文件。它应该是/root/.bashrc 而不仅仅是.bashrc。将文件添加到正确位置后,无需运行命令或 CMD。

构建

...
ADD iptables /iptables
RUN touch /root/.bashrc \
 && cat iptables >> /root/.bashrc
...

运行

docker run -it --cap-add=NET_ADMIN myImage /bin/bash

【讨论】:

  • 您不需要touch,因为如果文件不存在,>> 将创建该文件。
猜你喜欢
  • 2020-09-09
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-18
  • 2023-03-03
  • 1970-01-01
相关资源
最近更新 更多