Rails ruby 新手遇到部署问题,求解~~~

jojobo · 2023年02月07日 · 最后由 jojobo 回复于 2023年02月10日 · 1105 次阅读

本人使用 docker 来部署 ruby 服务,思路为先启动 postgres 数据库,再基于此启动 ruby 服务,但是初始化数据时报错,找解决方案找了一天还是找不到

第一步:启动 postgres 数据库

docker run -d --network=network1 --name db-for-tangpoetry  -e POSTGRES_USER=tangpoetry -e POSTGRES_PASSWORD=123456  -e POSTGRES_DB=tangpoetry_production -e PGDATA=/var/lib/postgresql/data/pgdata  -v tangpoetry-data:/var/lib/postgresql/data -p 5432:5432          postgres:14

第二步:启动 ruby 服务

docker run -d --network=network1 --name tangpoetry_container -p 3000:3000  -e DB_HOST=db-for-tangpoetry -e DB_PASSWORD=123456 -e RAILS_MASTER_KEY=rails123 tangpoetry

第三步:进入 ruby 服务

docker exec -it tangpoetry_container bash

当使用 rails db:create 报错,

报错信息


本地部署是成功的,但是在 linux 服务器上就报错了。ruby 新手,不知道这个有啥门道,求解

看一下 ruby 代码的数据库配置,可能是没有配置成 docker 容器的 IP,导致无法连接数据库。

daqing 回复

数据库配置如上,另外 DB_PASSWORD,DB_HOST 都写进环境变量中

jojobo 回复

你这个是配置的 production 环境的数据库连接,但是你 ruby 容器里,定义 RAILS_ENV=production 了吗?

daqing 回复

有的,在 Dockerfile 中配置了

jojobo 回复

先用 telnet 试试 PG 能否连接,如果不能连接,看一下 PG 容器的日志。

daqing 回复

试了下,也都能连接

jojobo 回复

docker exec -it tangpoetry_container bash 的容器里试

xinyifly 回复

容器内,ping、telnet 都失效,需要更新依赖,换了阿里云镜像(mirrors.aliyun.com),还是报错,又衍生到需要更改 dns,改了之后还是不能 update😭 😭

xinyifly 回复

如果在 tangpoetry_container 容器中,使用 rails db:create 报错,而且提示说无法连接服务器,就是两个容器不通的意思,但是我使用 docker network 已经将两个容器放在一个网络下,在本地部署是成功的,不知道为什么在服务器上就不行

williamherry 回复

万万没想到,竟然是自己服务器上的 docker 版本太低造成的,看了不少解决方案,也许是这个,https://stackoverflow.com/questions/24319662/from-inside-of-a-docker-container-how-do-i-connect-to-the-localhost-of-the-mach,也许是其他的。总之,下午的时候我升级了 docker,从 19 升级到 23,然后现在就解决了

谢谢几位大佬的帮忙解答,@daqing@xinyifly@williamherry

如果容器是分开启用的,其实不用另外设置--network 参数
容器之间的访问,host 直接用 host.docker.internal 就可以了
所以不升级的话你只要把 rails 应用中 pg 数据库的 host 改成上面即可

xeruzo 回复

嗯嗯,主要对 docker 里容器间访问不熟

需要 登录 后方可回复, 如果你还没有账号请 注册新账号