如何在Docker中为root设置.bashrc文件

41

我希望在一个(centos:6)Docker容器中给我的root用户提供一个.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

尝试将您的两个命令放在一个以分号 ; 分隔的 CMD 中,并重新构建/重新启动。 - user2915097
所以,如果我这样做并且在运行命令的/bin/bash部分之外运行它,它会运行但不会给我容器的交互控制。 - Matthew Herbst
我的意思是,当你的新镜像构建完成后,然后运行 docker run -it --cap-add=NET_ADMIN mynewimage /bin/bash - user2915097
@user2915097 这会导致 CMD 不被执行,因为它被替换了。 - Matthew Herbst
将 CMD 替换为 ENTRYPOINT 并重新构建。 - user2915097
2个回答

44

结果发现我添加文件的方式不正确。应该使用/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

22
不需要进行"touch"操作,因为">>"符号会在文件不存在的情况下创建文件。 - Matthieu

9

bash manpage中指出,在交互式模式下读取.bashrc。因此,如果您想使用一个读取.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会覆盖entrypoint或cmd,因此最好使用shell脚本包装原本使用的iptables命令和entrypoint,让它成为你的新的entrypoint/cmd。


我发现这个答案是针对这个问题正确的答案。当我们在不设置环境变量的情况下启动容器时,无论是root还是非root用户,都不会加载bashrc文件。设置 BASH_ENV 可能是解决这个问题的正确方法。 - Ryan Chou

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