我正在使用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 Run:docker run --rm --name nginx -p 80:80 --link mysql:mysql myNginxImage
引用的Dockerfile具有:
# Use baseimage-docker's init system.
CMD ["/sbin/my_init"]
如果您在执行docker run命令时未覆盖它,那么这就是“入口点”(我猜,这个问题也没有发布)。接下来将要进行一系列猜测,但是,我认为我是对的:-)
首先,文档指出:
乘客的工作方式类似于mod_ruby,mod_nodejs等。它将Nginx更改为应用程序服务器,并从Nginx运行您的应用程序。因此,要使您的Web应用程序正常运行,您只需在Nginx中添加一个虚拟主机条目即可描述您的应用程序所在的位置,剩下的便由Passenger负责。
然后,稍后在描述Nginx启动时:
默认情况下,Nginx清除其子进程(Passenger是其中之一)的所有环境变量(TZ除外)。这就是为什么您使用docker run -e,Docker链接和/ etc / container_environment设置的任何环境变量都不会到达Nginx的原因。
对于初始化行为,在启动进程之前先清除env变量,这是相当典型的。由于nginx的环境变量已清除,因此其随后启动的任何进程也将清除env vars。幸运的是,它们告诉您如何将变量传播到子进程:
要保留这些变量,请将以* .conf结尾的Nginx配置文件放在目录/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变量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句