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

Can I run a bash script from a file in a separate docker volume before a container starts?

我遇到这样一种情况,当容器启动,以便容器上的所有未来命令 运行 将在该 bash 环境下执行(它 运行 有一些脚本并设置了许多从其他地方获取的动态变量)。我使用卷而不是直接将此命令添加到图像的原因是因为我需要包含的环境文件在 Docker 文件上下文之外,并且 Docker 文件不支持那个.

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

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

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

编辑:作为测试,我正在尝试 运行 容器上的 rake db:create:all,例如 docker-compose run app rake db:create:all,它返回一个我需要的环境文件无法返回的错误被发现/加载。有趣的是,如果我 shell 进入容器并 运行 命令,它似乎工作得很好。因此,也许当通过 run 向容器发出命令时,它不一定会打开 shell,而是使用其他东西?

问题是 shell 其中 /src/app/bin/start-app 是 运行 不是交互式 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 中。 当你 shell 进入容器时它会起作用,因为 bam 你有一个交互式 shell 源文件:)