什么时候Dockervariables可用?

我正在做一些Rails的工作,在我的数据库configuration中,我有以下variables:

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

Rails保持失败,因为它表示它试图通过套接字连接,这表明价值是空的(这就是Rails如何倒退)。

但是,每当我通过docker execlogin容器,环境variables设置正确。

我后来将其更改为以下目的进行debugging:

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

它工作正常(这是前面报告的价值)。

所以我的问题是,在docker run期间的docker环境variables设置? 我在这里做错了什么? 我想我会很高兴反弹nginx作为我的Dockerfile中的最后一个命令,但是如果环境variables仍然没有设置,它不会觉得这样会解决任何事情。

更新

我从这个网页使用Dockerfile – https://rossfairbanks.com/2015/03/06/rails-app-on-docker-using-passenger-image.html

更新2docker运行:docker运行–rm – 名称nginx -p 80:80 – 链接mysql:mysql myNginxImage

所引用的Dockerfile有:

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

如果你在执行docker run命令时没有覆盖它,这是'入口点'(我猜,这个问题也没有发布在问题中)。 将要发生的事情是一堆猜测,但是,我想我是对的:-)

首先,文件说明:

乘客像mod_ruby,mod_nodejs等一样工作。它将Nginx变成一个应用程序服务器,并从Nginx运行你的应用程序。 因此,为了让您的网络应用程序正常运行,您只需将一个虚拟主机条目添加到Nginx中,该条目描述了您的应用程序的位置,而乘客则负责处理其余的部分。

之后,在描述Nginx的启动时:

默认情况下,Nginx会清除其子进程的所有环境变量(TZ除外)(Passenger就是其中之一)。 这就是为什么你使用docker run -e,Docker链接和/ etc / container_environment设置的任何环境变量都不会到达Nginx。

对于init行为来说,在启动流程之前清除env变量是相当典型的。 由于nginx已经清除了它的环境变量,所以它随后启动的任何进程都会清除env vars。 幸运的是,他们告诉你如何传播变量到子过程:

为了保留这些变量,在/etc/nginx/main.d目录下放置一个以* .conf结尾的Nginx配置文件,告诉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变量通过你。