首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法将django容器连接到linux主机上的postgres

无法将django容器连接到linux主机上的postgres
EN

Stack Overflow用户
提问于 2021-08-05 17:52:10
回答 2查看 110关注 0票数 0

在浏览了所有关于这个主题的Stackoverflow线程之后,我仍然无法解决这个问题。这只发生在我的Fedora笔记本电脑上,在我的Macbook上,码头集装箱工作得很好。我的docker-compose.yml文件非常标准:

代码语言:javascript
复制
version: "3.8"
services:
  app:
    container_name: data-management
    restart: always
    build: ./
    ports:
      - '3000:3000'
    links:
      - 'postgresdb'
    volumes:
      - ./:/usr/local/share/src/app
    env_file:
      - .dev.env

  postgresdb:
    container_name: be-postgres
    restart: always
    image: postgres:12.7-alpine
    ports:
      - '5432:5432'
    volumes:
      - postgres-db:/var/lib/postgresql/data
    env_file:
      - .dev.env

volumes:
  postgres-db:

如您所见,两个容器中的环境变量都是从文件中读取的:

代码语言:javascript
复制
POSTGRES_PASSWORD=devpassword123
POSTGRES_USER=devuser
POSTGRES_SERVICE=postgresdb
POSTGRES_PORT=5432

这些env变量也在settings.py中使用。

代码语言:javascript
复制
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'HOST': os.environ['POSTGRES_SERVICE'],
        'NAME': os.environ['POSTGRES_USER'],
        'PORT': os.environ['POSTGRES_PORT'],
        'USER': os.environ['POSTGRES_USER'],
        'PASSWORD': os.environ['POSTGRES_PASSWORD'],
    }
}

我遇到的问题是django应用程序无法连接到postgresDB:

django.db.utils.OperationalError:无法连接到服务器:主机不可访问,服务器是否运行在主机"postgresdb“(172.xx.x.x)上,并在端口5432上接受TCP/IP连接?

我还检查了postgres集装箱中的港口是否打开,它是:

代码语言:javascript
复制
/ # netstat -tuplen
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.11:37009        0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:5432            0.0.0.0:*               LISTEN      -
tcp        0      0 :::5432                 :::*                    LISTEN      -
udp        0      0 127.0.0.11:59651        0.0.0.0:*                           -

最后,但并非最不重要的,我点击postgres容器从django一号,似乎每件事都是好的。

这在我的macbook机器上运行得很好,因此,我认为我的Fedora笔记本电脑出了问题。我还注意到了一些其他的东西,我也发现奇怪的是django容器构建得很好,但是当我试图从容器安装一个包时,我会得到一个错误:

代码语言:javascript
复制
/usr/local/share/src/app # apk add gcc
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
ERROR: https://dl-cdn.alpinelinux.org/alpine/v3.13/main: temporary error (try again later)
WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.13/main: No such file or directory
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
ERROR: https://dl-cdn.alpinelinux.org/alpine/v3.13/community: temporary error (try again later)
WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.13/community: No such file or directory

我的Linux、docker以及网络技术肯定不足以解释为什么我的Fedora笔记本电脑很难运行这个简单的设置。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-12 18:01:36

结果,Fedora转而使用nftable,这与Docker不太合拍。最简单的解决方案是切换回iptables - sudo vim /etc/firewalld/firewalld.conf和change

代码语言:javascript
复制
# FirewallBackend
# Selects the firewall backend implementation.
# Choices are:
#       - nftables (default)
#       - iptables (iptables, ip6tables, ebtables and ipset)
FirewallBackend=iptables

有关更多信息,请参见这里被接受的答案

票数 0
EN

Stack Overflow用户

发布于 2021-11-10 13:05:48

试着使用标志“-网络主机”进行构建。这是链接

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68671378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档