【问题标题】:Can I run a bash script from a file in a separate docker volume before a container starts?我可以在容器启动之前从单独的 docker 卷中的文件运行 bash 脚本吗?
【发布时间】:2015-11-06 17:11:46
【问题描述】:

我有一种情况,当容器启动时,我需要 source 一个位于单独卷中的 bash 环境文件(通过 volumes_fromdocker-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,而是使用别的东西?

【问题讨论】:

  • 对我来说很好。你的基础镜像和运行命令是什么?
  • @ISanych 啊,很高兴知道我在正确的轨道上,如果它适合你。使用 Dockerfile 和 docker-compose.yml 文件编辑帖子

标签: docker dockerfile docker-compose


【解决方案1】:

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

您可以通过以下方式解决此问题: 将 env 文件添加到: /root/.profile

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

并且还通过(通过 Dockerfile 中的 hack :) 将您的命令作为登录 shell 运行(无论如何,sh 对您来说都是 bash):

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

作为命令。这应该可以正常工作:) 问题确实只是缺少该文件的来源,因为您在通过 docker 命令指令运行时正在非交互式外壳中运行。 当你进入容器时它会起作用,因为你得到了一个交互式 shell 来获取该文件:)

【讨论】:

  • 绝对是这样。我想使用 bash,所以我最终使用 bash --login -c '/src/app/bin/start-app' 达到同样的效果 - 效果很好。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多