dockerfile中的docker run命令仅在未在cli上指定命令时才执行

时间:2018-12-06 20:43:04

标签: docker

说我有一个Dockerfile:

.
.
RUN echo 'source /root/script.sh' >> /etc/bash.bashrc

(脚本添加了一些env变量)

如果我是

1)执行以下操作:

docker run -it -v /home/user/script.sh:/root/script.sh image

带我进入shell,如果我调用“ env”,我会看到脚本设置的变量

但是如果我:

2)执行以下操作:

docker run -it -v /home/user/script.sh:/root/script.sh image env

它打印出env并退出,我的变量丢失了

我想念什么?即使我在docker run命令的末尾指定了“ env”之类的命令/脚本,我也需要该变量存在

1 个答案:

答案 0 :(得分:1)

当您运行类似命令时

docker run ... image command

Docker 直接运行您提供的command;它不会启动任何类型的外壳,也没有机会读取.bashrc或类似文件。

我在这里建议两件事:

  1. 如果您的程序确实需要以某种形式设置环境变量,请直接使用Dockerfile ENV指令设置它们。不要尝试编辑.bashrc/etc/profile或任何其他Shell点文件;他们将无法可靠地运行。

  2. 您可以在现场安装尽可能多的东西,从而无需更改环境变量。例如,Python支持“虚拟环境”概念,该概念允许隔离的库环境,这需要更改$PATH和类似的东西;但是Docker本身提供了相同的隔离,因此只需将其安装到“全局”软件包空间即可。

如果您真的不能管理这些事情,则可以编写一个入口点脚本来设置环境变量,然后启动容器的命令。看起来像

#!/bin/sh
. /root/script.sh
exec "$@"

然后您可以将其包含在Dockerfile中

...
COPY entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]
CMD ["/app/myapp"]

(如果您需要使用docker exec在容器中获取调试外壳程序,那么它将不是入口点的子进程,也不会获取其环境变量。)