Docker Variables在什么时候可用?

时间:2015-04-18 23:13:03

标签: ruby-on-rails nginx docker

我正在使用Rails做一些工作,在我的数据库配置中,我有以下变量:

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

Rails一直在失败,因为它说它试图通过套接字连接,这向我表明价值是空的(这就是Rails如何倒退)。

但是,每次我通过docker exec登录容器时,都会正确设置环境变量。

我稍后将其更改为以下调试目的:

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

它工作正常(这是之前报道的值)。

所以我的问题是,在docker run期间,docker环境变量设置在什么时候?我在这里做错了吗?我想我很乐意将nginx作为我的Dockerfile中的最后一个命令反弹,但是如果环境变量仍未设置,那么它就不会解决任何问题。

更新

我正在使用此网页中的Dockerfile - https://rossfairbanks.com/2015/03/06/rails-app-on-docker-using-passenger-image.html

更新2 Docker运行:docker run --rm --name nginx -p 80:80 --link mysql:mysql myNginxImage

1 个答案:

答案 0 :(得分:4)

引用的Dockerfile有:

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

这是&#39;入口点&#39;如果你在执行docker run命令时没有覆盖它(我猜测,那也没有在问题中发布)。接下来要做的是一堆猜测,但是,我认为我说得对: - )

首先,文档说明:

  

Passenger的工作方式类似于mod_ruby,mod_nodejs等。它改变了Nginx   进入应用程序服务器并从Nginx运行您的应用程序。所以得到   您的Web应用程序启动并运行,您只需添加虚拟主机条目   到Nginx,它描述了你的应用程序的位置,以及乘客将采取的   照顾其他人。

然后,稍后,在描述Nginx启动时:

  

默认情况下,Nginx会清除所有环境变量(TZ除外)   儿童过程(乘客是其中之一)。这就是为什么   你用docker run -e,Docker链接和设置的环境变量   / etc / container_environment,无法访问Nginx。

这对于在启动进程之前清除env变量的init行为是相当典型的。由于nginx已清除其环境变量,因此随后启动的任何进程也将清除env变量。幸运的是,他们告诉您如何将变量传播到子流程:

  

要保留这些变量,请放置一个以。结尾的Nginx配置文件   * .conf位于/etc/nginx/main.d目录中,您可以告诉Nginx保留这些变量。例如,在链接PostgreSQL时   容器或MongoDB容器:

然后他们展示了一个例子。您可以在与Dockerfile相同的目录中创建一个文件,调用mysql-env.conf,它包含:

env MYSQL_PORT_3306_TCP_ADDR;

然后,在您的Dockerfile中,输入以下行:

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

这应该为你泄漏env变量。