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

jojobo · February 07, 2023 · Last by jojobo replied at February 10, 2023 · 1138 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 #0

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

Reply to jojobo #1

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

Reply to daqing #2

有的,在 Dockerfile 中配置了

Reply to jojobo #3

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

Reply to daqing #4

试了下,也都能连接

Reply to jojobo #5

docker exec -it tangpoetry_container bash 的容器里试

Reply to xinyifly #6

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

Reply to xinyifly #6

如果在 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 #12

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

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