首页 > 解决方案 > 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

标签: ruby-on-railspostgresqldockerdocker-composeport

解决方案


推荐阅读