我在本地系统上使用Ruby on Rail安装和运行Docker示例时遇到问题。请查看我的Docker配置文件:-
停靠文件
FROM ruby:2.3.1
RUN useradd -ms /bin/bash web
RUN apt-get update -qq && apt-get install -y build-essential
RUN apt-get -y install nginx
RUN apt-get -y install sudo
# for postgres
RUN apt-get install -y libpq-dev
# for nokogiri
RUN apt-get install -y libxml2-dev libxslt1-dev
# for a JS runtime
RUN apt-get install -y nodejs
RUN apt-get update
# For docker cache
WORKDIR /tmp
ADD ./Gemfile Gemfile
ADD ./Gemfile.lock Gemfile.lock
ENV BUNDLE_PATH /bundle
RUN gem install bundler --no-rdoc --no-ri
RUN bundle install
# END
ENV APP_HOME /home/web/cluetap_app
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME
ADD . $APP_HOME
RUN chown -R web:web $APP_HOME
ADD ./nginx/nginx.conf /etc/nginx/
RUN unlink /etc/nginx/sites-enabled/default
ADD ./nginx/cluetap_nginx.conf /etc/nginx/sites-available/
RUN ln -s /etc/nginx/sites-available/cluetap_nginx.conf /etc/nginx/sites-enabled/cluetap_nginx.conf
RUN usermod -a -G sudo web
docker-compose.yml
version: '2'
services:
postgres:
image: 'postgres:9.6'
environment:
- PGDATA=/var/lib/postgresql/data/pgdata
- POSTGRES_PASSWORD=
- POSTGRES_USER=postgres
- POSTGRES_HOST=cluetapapi_postgres_1
networks:
- default
- service-proxy
ports:
- '5432:5432'
volumes:
- 'postgres:/var/lib/postgresql/data'
labels:
description: "Postgresql Database"
service: "postgresql"
web:
container_name: cluetap_api
build: .
command: bash -c "thin start -C config/thin/development.yml && nginx -g 'daemon off;'"
volumes:
- .:/home/web/cluetap_app
ports:
- "80:80"
depends_on:
- 'postgres'
networks:
service-proxy:
volumes:
postgres:
当我运行docker-compose build和docker-compose up -d这两个命令时,它运行成功,但当我从url命中时,它出现内部服务器错误,错误为
Unexpected error while processing request: could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?
could not connect to server: Cannot assign requested address
Is the server running on host "localhost" (::1) and accepting
TCP/IP connections on port 5432?
我已经应用了一些解决方案,但它没有为我工作,请指导我,我是新的 Docker 和AWS。
4条答案
按热度按时间blpfk2vs1#
问题是您试图连接到DB容器内的localhost。您为postgres执行的
5432:5432
端口Map将5432Map到主机的localhost。现在,您的
web
容器代码正在容器内部运行,并且在它的localhost上没有任何内容:5432。因此,您需要更改config中的连接详细信息以连接到
postgres:5432
,这是因为您将postgres DB服务命名为postgres
改变这一点,它应该工作。
31moq8wy2#
默认情况下,postgres图像已经暴露到5432,因此您可以在yml中删除该部分。
然后,如果您希望检查Web服务是否可以连接到您的postgres服务,则可以运行此
docker-compose exec web curl postgres:5432
,然后它应返回:curl:(52)来自服务器的空回复
如果无法连接,它将返回:
curl:(6)无法解析主机:后灰色或** curl :(7)无法连接到postgres端口5432:连接被拒绝**
更新日期:
我现在知道问题所在了,因为你试图在本地主机上连接,所以你应该连接到
postgres
服务。fzwojiic3#
我在Ubuntu 20.04中使用Docker和Traefik处理Rails 6应用程序时也遇到了同样的问题。
在我的例子中,我试图将在Docker容器中运行的RubyonRails应用程序连接到在主机上运行的PostgreSQL数据库。
因此,每次尝试连接到数据库时,都会出现以下错误:
以下是我的修正方法:
因此,容器中运行的应用程序首先通过Map到端口
80
上的主机的Traefik向主机公开。首先,我必须修改我的PostgreSQL数据库配置文件,以接受来自其他IP地址的远程连接。致命-Peer authentication failed for user (PG::ConnectionBad)
其次,我必须创建一个Docker网络,Traefik和其他将通过它进行代理的应用程序将用途:
第三,我在
docker-compose.yml
文件中设置应用程序,使其使用刚才创建的同一网络:最后,在我的
.env
文件中,我将主机的私有IP地址指定为DATABASE_HOST
作为环境变量,方法如下:x9ybnkn64#
我刚才也有这个问题,我的解决办法是
1.删除Postgres服务中的端口
port: '5432:5432'
1.将
POSTGRES_HOST=cluetapapi_postgres_1
更改为POSTGRES_HOST=localhost
当你需要访问你的数据库时,就像
sqlalchemy.url = postgresql+psycopg2://postgres:password@postgres/dbname
这样使用