在容器启动之前,我可以从单独的docker卷中的文件运行bash脚本吗?

时间:2015-11-06 17:11:46

标签: docker dockerfile docker-compose

我有一种情况,我需要source一个bash环境文件,当一个容器启动时,它存在于一个单独的卷中(通过volumes_from中的docker-compose拉入)以便所有未来在容器上运行的命令将在该bash环境下执行(它运行一些脚本并设置从其他地方引入的大量动态变量)。我使用卷而不是直接将此命令直接添加到映像的原因是因为我需要包含的环境文件在Dockerfile上下文之外,而Dockerfiles不支持它。

我尝试将source /path/to/volume/envfile行添加到root用户的.bashrc文件中,希望在容器启动时运行它,但这不起作用。我假设这是因为在容器/ shell启动并且.bashrc命令已经运行(这是有道理的)之后,卷实际上并未实际安装。

有没有人知道如何才能完成这样的事情?我对其他方法持开放态度,但是我能在这里改变的一件事就是在Docker上下文中移动我需要的文件,因为这会破坏很多其他方法。

我的(稍加编辑)Dockerfile和docker-compose.yml文件:https://gist.github.com/joeellis/235d90799eb647ab00ec

编辑:作为测试,我试图在容器上运行rake db:create:all,例如docker-compose run app rake db:create:all,它返回错误,无法找到/加载我需要的环境文件。有趣的是,如果我进入容器并运行命令,这一切似乎都很有效。所以也许当一个容器通过run给出一个命令时,它不一定会打开一个shell,但是还会使用别的东西吗?

1 个答案:

答案 0 :(得分:1)

问题是运行/src/app/bin/start-app的shell不是交互式shell => .bashrc未被阅读!

您可以通过执行以下操作来解决此问题: 改为添加env文件: /root/.profile

RUN echo "source /src/puppet/path/to/file/env/bootstrap" >> /root/.profile

并且还运行你的命令作为登录shell通过(sh是bash无论如何通过Dockerfile中的hack :):)

command: "sh -lc '/src/app/bin/start-app'"

作为命令。这应该工作正常:) 由于您在通过docker命令指令运行时在非交互式shell中运行,因此缺少源文件的问题。 当你进入容器时它会起作用,因为bam你有一个交互式shell来源该文件:)