说我有一个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”之类的命令/脚本,我也需要该变量存在
答案 0 :(得分:1)
当您运行类似命令时
docker run ... image command
Docker 直接运行您提供的command
;它不会启动任何类型的外壳,也没有机会读取.bashrc
或类似文件。
我在这里建议两件事:
如果您的程序确实需要以某种形式设置环境变量,请直接使用Dockerfile ENV
指令设置它们。不要尝试编辑.bashrc
或/etc/profile
或任何其他Shell点文件;他们将无法可靠地运行。
您可以在现场安装尽可能多的东西,从而无需更改环境变量。例如,Python支持“虚拟环境”概念,该概念允许隔离的库环境,这需要更改$PATH
和类似的东西;但是Docker本身提供了相同的隔离,因此只需将其安装到“全局”软件包空间即可。
如果您真的不能管理这些事情,则可以编写一个入口点脚本来设置环境变量,然后启动容器的命令。看起来像
#!/bin/sh
. /root/script.sh
exec "$@"
然后您可以将其包含在Dockerfile中
...
COPY entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]
CMD ["/app/myapp"]
(如果您需要使用docker exec
在容器中获取调试外壳程序,那么它将不是入口点的子进程,也不会获取其环境变量。)