ruby-on-rails - Docker-compose Rails 后端 + postgresql 无法将主机名“db”转换为地址:名称或服务未知
问题描述
每当我运行两个容器(使用 docker-compose 或单独运行,首先使用 postgres)时,后端容器运行 db:create 的那一刻(通过RUN RAILS_ENV=production bin/rails db:create && RAILS_ENV=production bin/rails db:migrate
其 Dockerfile 中的指令或rails db:create
在交互运行悬空图像时通过 CLI)我在终端:
could not translate host name "db" to address: Name or service not known
Couldn't create 'pia_production' database. Please check your configuration.
这是我的 docker-compose yml:
version: '3'
services:
db:
build: ./db/
volumes:
- ./tmp/db:/var/lib/postgresql/data
restart: always
expose:
- "5432"
ports:
# exposed port:postgres port
- "5432:5432"
env_file:
- ./db/.env
# these environment variables should be defined in the .env file
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
PG_DATA: ${PG_DATA}
networks:
- my-network
back:
build: ./pia-rails/
volumes:
- ./logs/:/home/adminpia/pia-back/log/
ports:
- 3000:3000
links:
- db:db
depends_on:
- db
networks:
- my-network
env_file:
- ./pia-rails/.env
networks:
my-network:
driver: bridge
我已经验证了开始顺序,我尝试了等待它(github.com/vishnubob/wait-for-it.git)和我自己的脚本:
#!/bin/bash
a=0
t=0
while ((a < 1))
do
t=$(( t + 1 ))
echo -ne "No process on port 5432, waiting $t s for postgresql...\r"
echo -ne "\b\b"
sleep 1s
b=$(netstat -tulpn | grep 5432)
if [ ! -z "$b" ]
then
a=1
echo "A process is listening on 5432, presuming postgresql"
exit 0
fi
done
我知道这是多余的信息,因为运行 docker-compose up db 然后后端产生相同的结果。
我在这里寻找答案,但没有找到关于 Rails+posgresql 的具体答案,也没有通过等待 postgresql 容器在端口 5432 上侦听(显然在配置端口之后)来解决的问题。
数据库映像:Postgres:12-alpine 后端映像:ruby 2.7.0,rails 6.0.3.4,uname -a:
Linux 8e59808d6845 5.4.0-52-generic #57~18.04.1-Ubuntu SMP Thu Oct 15 14:04:49 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
Docker 版本 19.03.13,构建 4484c46d9d
作为对@3DPrintScanner 的回复,我可以看到我的数据库容器:
Name Command State Ports
----------------------------------------------------------------
cnildocker_db_1 docker-entrypoint.sh postgres Exit 0
但它似乎没有使用 5432 端口,即使docker run -p 5432:5432 --env-file ./.env -v PG_DATA -it postgres:12-alpine
它本身似乎工作正常:
PostgreSQL init process complete; ready for start up.
2020-11-02 13:12:04.054 UTC [1] LOG: starting PostgreSQL 13.0 on x86_64-pc-linux-musl, compiled by gcc (Alpine 9.3.0) 9.3.0, 64-bit
2020-11-02 13:12:04.055 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
2020-11-02 13:12:04.056 UTC [1] LOG: listening on IPv6 address "::", port 5432
2020-11-02 13:12:04.060 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2020-11-02 13:12:04.066 UTC [45] LOG: database system was shut down at 2020-11-02 13:12:03 UTC
2020-11-02 13:12:04.075 UTC [1] LOG: database system is ready to accept connections
这是来自后端图像的我的 database.yml:
development:
adapter: postgresql
host: db
encoding: unicode
database: pia_development
pool: 5
username:
password:
template: template0
test:
adapter: postgresql
host: db
encoding: unicode
database: pia_test
pool: 5
username:
password:
template: template0
production:
adapter: postgresql
host: db
encoding: unicode
database: pia_production
pool: 5
username: pia
password: #{PIA_PWD}
template: template0
解决方案
推荐阅读
- php - WooCommerce:如何获取当前产品的所有类别
- c# - C# 卷积算法正在生成一个非常响亮的 .wav 文件
- c++ - 如果我在工厂模式中使用堆栈上的对象而不是堆上的对象有什么缺点?
- python - 与 spark 相比,dask 的`read_parquet` 真的很慢
- c# - C# UWP - 无法连接到串口
- python - 如何在 keras 中使用 cifar100 实现denseNet 架构?
- javascript - 单击按钮时 iFrame 将不可见
- javascript - 如何动态填充 SVG 的不同路径?
- java - Spark找到每列的最大比例
- java - 在 intellij 项目中使用下载的 .class 文件