postgresql - docker-compose 有一些问题
问题描述
我对 flask 、 postgres 和 docker 很陌生。我正在尝试对我们的应用程序进行 docker 化,以便新开发人员不必担心安装 python 依赖项即可开始开发。我目前有两个容器,一个用于烧瓶应用程序,一个用于 postgres db。我遇到的问题是,当我将两者组合在一起时,它们无法相互连接。我已经定义了自己的网络,以确保它们在同一个网络上运行,但这似乎仍然不能解决问题。当我在容器外运行烧瓶应用程序并尝试连接到容器化的 postgres 数据库时,连接没有问题,并且工作正常。
任何帮助将不胜感激提前谢谢
烧瓶应用程序的 Dockerfile
FROM python:3.7-alpine3.7
LABEL maintainer="uwblueprint"
LABEL org.label-schema.schema-version="1.0"
LABEL org.label-schema.name="elevate-api"
LABEL org.label-schema.vcs-url="https://gitlab.com/uwblueprint/elevate-api/"
LABEL org.label-schema.vendor="UW Blueprint"
## Copy source and environment-config files.
COPY app/ ./app/
WORKDIR /app
COPY Pipfile Pipfile.lock ./
## Install external dependencies.
RUN apk add --no-cache libpq
## Install application dependencies.
RUN apk add --no-cache --virtual build-deps \
gcc musl-dev postgresql-dev libffi-dev && \
pip3 install --upgrade pip pipenv gunicorn && \
pipenv --python 3.7 && \
pipenv install --system --deploy && \
apk del build-deps
EXPOSE 5000
CMD ["flask", "run"]
Docker 撰写文件
version: '3.7'
services:
database:
image: registry.gitlab.com/uwblueprint/elevate-api/postgres:latest
build:
context: ./external/postgres
cache_from:
- registry.gitlab.com/uwblueprint/elevate-api/postgres:latest
- postgres:10.5-alpine
container_name: database
env_file: ./external/postgres/configs/.env
volumes:
- postgres.data:/var/lib/postgresql/data # persist data
ports:
- "5432:5432"
networks:
- "api_net"
api:
build: .
ports:
- "5000:5000"
networks:
- "api_net"
networks:
api_net:
volumes:
postgres.data:
Python SQL 炼金术代码
import os
from flask_sqlalchemy import SQLAlchemy
from app import app
# Make sure that DB_PASS is an environment variable:
##if 'DB_PASS' not in os.environ:
## raise EnvironmentError("Could not find environment variable 'DB_PASS',")
##user = os.environ.get("DB_USER", "robot")
user ="fakeUser"
password = "fakePassword"
##password = os.environ["DB_PASS"]
host = os.environ.get("DB_HOST", "0.0.0.0")
port = os.environ.get("DB_PORT", "5432")
name = os.environ.get("DB_NAME", "elevate")
# Configure flask-sqlalchemy.
app.config["SQLALCHEMY_DATABASE_URI"] = "postgresql://%s:%s@%s:%s/%s" % (
user, password, host, port, name
)
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
# TODO: Find the optimal pool recycle time for PostgreSQL.
app.config["SQLALCHEMY_POOL_RECYCLE"] = 7200 # in milliseconds
# The db object is aware of the Flask application lifecycle, and will do things
# like close the database session when a Flask request ends.
#
# This saves a lot of headaches compared to the plain SQLAlchemy library, where
# I kept running into issues about database-session related objects trying
# to access the session when I had closed it prematurely (due to SQLAlchemy's
# lazy-loading data acess methods).
db = SQLAlchemy(app)
解决方案
在 docker-compose 中,您可以通过服务名称在服务之间建立连接。您可以在文档中了解这一点。
默认情况下,Compose 会为您的应用程序设置一个网络。服务的每个容器都加入默认网络,并且可以被该网络上的其他容器访问,并且可以通过与容器名称相同的主机名被它们发现。
设置host
或DB_HOST
环境为database
. 127.0.0.1
不会工作。
推荐阅读
- microsoft-cognitive - 计算机视觉 API v1.0 和 v2.0 有什么区别?
- matlab - 如何在原始数据下获得一条线
- html - 字体 Lato,加粗一些捷克字符
- c# - Google OAuth 在成功验证后显示错误网页(在桌面应用程序中使用 Google API .NET)
- c# - 如何使用 selenium c# 计算嵌套的 div?
- wso2 - WSO2 Identity Server oAuth2:如何保留来自 IDP 的原始访问令牌
- html - align-items:baseline 和 align-items:flexstart 没有区别
- php - Adobe 括号 - 实时预览不起作用 - Chrome 远程调试
- python - 使代码不区分大小写、Python、Discord Bot
- c# - 实体框架核心日志警告