2015-04-18 42 views
2

我在做與Rails的一些工作,在我的數據庫配置,我有以下變量:什麼時候Docker變量可用?

host: <%= ENV['MYSQL_PORT_3306_TCP_ADDR'] %> 

Rails的不斷失敗,因爲它說,這是試圖通過一個套接字,這表明我的連接價值是空的(這就是Rails如何倒退)。

但是,每次通過docker exec登錄到容器時,環境變量都已正確設置。

後來我改變了它用於調試目的以下幾點:

host: 172.17.0.15 # <%= ENV['MYSQL_PORT_3306_TCP_ADDR'] %> 

它工作得很好(這是此前報道的值)。

所以我的問題是,在docker run期間的碼頭環境變量集?我在這裏做錯了什麼?我想我會很高興將nginx作爲我的Dockerfile中的最後一條命令,但如果環境變量仍未設置,它不會覺得這樣可以解決任何問題。

更新

我使用Dockerfile從這個網頁 - https://rossfairbanks.com/2015/03/06/rails-app-on-docker-using-passenger-image.html

更新2 泊塢窗運行:運行搬運工--rm --name nginx的-p 80:80 - 鏈接MySQL的:MySQL的myNginxImage

+0

容器首次啓動時,該容器的'入口點'將設置所有環境變量。如果你能顯示你的Dockerfile,以及啓動的進程沒有得到環境變量,這將會有所幫助。 (如果存在鏈接,則從入口點到流程失敗的所有程序/腳本)。 – Greg

+0

我應該在入口點閱讀更多內容 - 添加了Dockerfile源代碼。 – aronchick

+0

我應該問過,我希望看到docker run命令也是這樣的:-) – Greg

回答

4

的Dockerfile引用的有:

# Use baseimage-docker's init system. 
CMD ["/sbin/my_init"] 

這是'入口點',如果你在執行docker run命令時沒有覆蓋它(我猜,這個問題也沒有在問題中公佈)。是什麼樣的,遵循的是一堆猜測,但是,我想,我是不是正確的:-)

首先,文檔指出:

客運就像一個mod_ruby,mod_nodejs,等它改變Nginx 到應用程序服務器並從Nginx運行你的應用程序。因此,要獲得 您的Web應用程序啓動並運行,您只需將虛擬主機條目 添加到Nginx中,該程序描述了您的應用程序的位置,而乘客則需要 注意其餘部分。

然後,後來,描述Nginx的啓動時:

默認情況下,Nginx的清除所有環境變量(TZ除外)爲其 子進程(客車是其中之一)。這就是爲什麼您使用docker run -e,Docker鏈接和 /etc/container_environment設置的任何 環境變量都不會到達Nginx。

這對init行爲在啓動進程之前清除env變量非常典型。由於nginx已清除了其環境變量,因此隨後啓動的任何進程都將清除env vars。幸運的是,他們告訴你如何將變量傳播到子流程:

要保留這些變量,將Nginx上的配置文件與 結尾的* .conf文件目錄/etc/nginx/main.d,在你告訴Nginx保存這些變量。例如,當鏈接PostgreSQL的 容器或MongoDB容器時:

然後它們顯示一個例子。你可以創建一個文件,調用的mysql-env.conf,在相同的目錄中Dockerfile,它包含:

env MYSQL_PORT_3306_TCP_ADDR; 

然後,在你Dockerfile,放線:

ADD mysql-env.conf /etc/nginx/main.d/mysql-env.conf 

這應該會泄漏env變量。

+0

這是一個非常好的答案,而且我錯過了文檔中的這一幕。謝謝! – aronchick

相關問題