我在DigitalOcean上与Dokku一起部署了Rails应用程序。我创建了一个Postgres数据库,并将其与Rails应用程序链接。一切正常,直到我重新启动了Droplet。我发现应用程序停止工作是因为重新启动时,每个Docker容器都获得了一个新端口,而Rails应用程序无法与其连接。如果我运行dokku postgresql:info myapp
,它将显示旧端口,但已更改。如果我手动更改database.yml并将其推送到dokku存储库,则一切正常。
那么如何防止每次服务器重启时Docker分配不同的端口?或者,也许有一个选项可以更改正在运行的容器的端口。
最佳答案
我在Dokku上没有太多经验,但是对于docker来说,没有A容器端口这样的东西。
在docker中,您可以公开容器的端口以接收传入的请求,并将其映射到主机中的特定端口。
这样,您就可以在容器中运行postgres,并告诉docker您想公开5432(默认的postgresql端口)以接收传入的请求:
sudo docker run --expose=5432 -P <IMAGE> <COMMAND>
--expose=5432
告诉docker公开端口5432以接收来自外界的传入连接。-P
标志告诉docker将容器中所有公开的端口映射到主机的端口。这样,您可以连接到指向主机的ip:port的postgres。
如果要将容器的端口映射到其他主机端口,可以使用-p标志:
sudo docker run --expose=5432 -p=666 <IMAGE> <COMMAND>
不知道这是否可以帮助您使用Dokku环境,但我希望如此。
有关docker的run命令的更多信息,请参见:https://docs.docker.com/reference/commandline/cli/#run
关于ruby-on-rails - 在特定端口上运行Docker容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25350496/