python - 无法从同一 docker swarm 上运行的其他服务连接到 postgres 服务?

标签 python docker flask-sqlalchemy docker-swarm

我有这个简单的 flask 应用程序:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import time

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI']  = 'postgresql+psycopg2://{user}:{pwd}@{host}:{port}/{db}'.format(
    user = 'postgres',
    pwd = '123456',
    host = 'db',
    port = '5432',
    db = 'test'
)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
        return '<User %r>' % self.username

if __name__ == "__main__":
    db.create_all()
    app.run(host='0.0.0.0', port=80)

我使用以下 Dockerfile 构建它:

FROM python:3.6

WORKDIR /app

COPY . /app

RUN pip install -r requirements.txt

EXPOSE 80

CMD ["python", "app.py"]

如下:

sudo docker build -t app . 

还有我的docker-compose.yml:

version: "3"
services:
  web:
    image: app:latest
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
    ports:
      - "4000:80"
    depends_on:
      - db
    networks:
      - webnet
  db:
    image: postgres
    expose:
      - 5432
    volumes:
      - /var/www/docker-tutorial/data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: 123456
      POSTGRES_DB: test
networks:
  webnet:

我的requirements.txt文件:

Flask
Flask-SQLAlchemy
psycopg2

我正在运行:

 docker stack deploy -c docker-compose.yml getstarted

一切正常,但连接数据库时出现以下异常:

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not translate host name "db" to address: Name or service not known

有什么想法导致异常吗?另外,我尝试将 sqlalchemy 的主机参数替换为“getstarted_db”,这是服务的名称,但这也不起作用。

最佳答案

感谢 maxm 评论,我能够解决问题,问题是 webdb 服务不在同一网络中。所以我的docker-compose.yml变成如下:

version: "3"
services:
  web:
    image: hello:latest
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
    ports:
      - "4000:80"
    depends_on:
      - db
    networks:
      - webnet
  db:
    image: postgres
    expose:
      - 5432
    volumes:
      - /var/www/docker-tutorial/data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: 123456
      POSTGRES_DB: test
    networks:
      - webnet

networks:
  webnet:

关于python - 无法从同一 docker swarm 上运行的其他服务连接到 postgres 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57256217/

相关文章:

azure - 如何将 ubuntu 容器部署到 Azure 容器实例并保持其运行

mysql - 我的结果中有重复记录

python - 删除 pandas DataFrame 中的行,其中该行包含列表中存在的字符串?

python - 使用 sklearn.utils.resample 带分层和不带分层的区别

python - 使用 python os 或 subprocess 模块在后台运行命令行程序

Azure 应用服务多容器(预览)NGINX connect() 失败 (111 : Connection refused) issue

python - 如何在不使用已弃用的 Gdk.Screen.get_width() 的情况下在 Python/GTK 中获取总屏幕大小?

windows - Docker volume - windows主机和linux容器

ssl - 使用 SSL 连接时与 MySQL 的连接丢失

python - Flask SQLAlchemy 的表(模型)继承