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

jojobo · February 07, 2023 · Last by jojobo replied at February 10, 2023 · 1095 hits

本人使用 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,导致无法连接数据库。

Reply to daqing

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

Reply to jojobo

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

Reply to daqing

有的,在 Dockerfile 中配置了

Reply to jojobo

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

Reply to daqing

试了下,也都能连接

Reply to jojobo

docker exec -it tangpoetry_container bash 的容器里试

Reply to xinyifly

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

Reply to xinyifly

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

万万没想到,竟然是自己服务器上的 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 改成上面即可

Reply to xeruzo

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

You need to Sign in before reply, if you don't have an account, please Sign up first.