我正在使用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
答案 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变量。