2015-11-06 53 views
2

我有一種情況,我需要source一個bash環境文件,它存放在一個單獨的卷(通過volumes_fromdocker-compose中提取),當容器啓動時,所有未來的命令在該容器上運行將在該bash環境下執行(它運行一些腳本並設置從其他地方拉入的大量動態變量)。我使用卷而不是直接將此命令直接添加到映像的原因是因爲我需要包含的環境文件位於Dockerfile上下文之外,並且Dockerfiles不支持該文件。在容器啓動之前,我可以在單獨的泊塢窗卷中的文件中運行bash腳本嗎?

我嘗試將source /path/to/volume/envfile行添加到根用戶的.bashrc文件中,希望它在容器啓動時運行,但這不起作用。我假設這是因爲直到容器/外殼程序啓動並且已經運行命令(這是有道理的)之後才實際安裝這些卷。

有沒有人有任何想法,我可以如何完成這樣的事情?我接受其他方法,但是我不能在這裏改變的一件事就是移動Docker上下文中需要的文件,因爲這會破壞很多其他的東西。

我(略編輯)Dockerfile和碼頭工人,compose.yml文件:https://gist.github.com/joeellis/235d90799eb647ab00ec

編輯:而作爲一個測試,我想運行在容器上一個rake db:create:all,像docker-compose run app rake db:create:all這是返回一個錯誤我所需要的環境文件無法找到/加載。有趣的是,如果我將shell放入容器並運行命令,這一切似乎都很好。所以也許當一個容器通過run得到一個命令時,它不一定會打開一個shell,而是使用其他的東西?

+1

適合我工作。你的基本圖像和運行命令是什麼? – ISanych

+0

@ISanych啊,很高興知道我在正確的軌道上,如果它適合你。編輯後的Dockerfile和docker-compose.yml文件 – joeellis

回答

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中:)):

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

作爲命令。這應該工作得很好:) 這個問題真的只是缺少源文件,因爲你在通過docker命令指令運行時運行在非交互式shell中。 它適用於當你進入容器外殼,因爲巴姆你有一個交互式外殼,源文件:)

+0

確實如此。我想使用bash,所以我最終使用'bash --login -c'/ src/app/bin/start-app'來達到同樣的效果 - 效果很好。非常感謝你的幫助! – joeellis