AWS ECS上的PostgreSQL:psycopg2.OperationalError端口号5432无效

我在通过AWS ECS上的psycopg2进行数据库连接时遇到问题。 我有一个应用程序容器和一个数据库容器。 容器被链接。

该应用程序有一个入口点脚本,在启动应用程序服务器之前检查数据库是否已经启动。

$ until psql -h "$DB_HOST" -U "$DB_USER" -c '' && >&2 echo "Postgres is up"; do >&2 echo "Postgres is unavailable - sleeping" sleep 1 done > Is the server running on host "db" (172.17.0.3) and accepting > TCP/IP connections on port 5432? > Postgres is unavailable - sleeping > Postgres is up 

这部分工作正常,但一旦应用服务器启动,并试图连接到数据库,我得到以下错误:

 psycopg2.OperationalError: invalid port number: "tcp://172.17.0.3:5432" 

我不知道可能是什么情况。 这在Docker本地运行时可以正常工作。

任何提示,将不胜感激。 谢谢!

 #!/bin/bash set -e cmd="$@" if [ -z "$POSTGRES_USER" ]; then export POSTGRES_USER=postgres fi export DATABASE_URL=postgres://$POSTGRES_USER:$POSTGRES_PASSWORD@postgres:5432/$POSTGRES_USER function postgres_ready(){ python << END import sys import psycopg2 try: conn = psycopg2.connect(dbname="$POSTGRES_USER", user="$POSTGRES_USER", password="$POSTGRES_PASSWORD", host="postgres") except psycopg2.OperationalError: sys.exit(-1) sys.exit(0) END } until postgres_ready; do >&2 echo "Postgres is unavailable - sleeping" sleep 1 done >&2 echo "Postgres is up - continuing..." exec $cmd 

所以给它更多的背景。 该应用程序是用Django编写的,这里是数据库configuration部分:

 DATABASES = { 'default': { # Requests will be wrapped in a transaction automatically # https://docs.djangoproject.com/en/1.10/topics/db/transactions/#tying-transactions-to-http-requests 'ATOMIC_REQUESTS': True, 'ENGINE': 'django.contrib.gis.db.backends.postgis', 'NAME': os.getenv('DB_NAME', 'postgres'), 'USER': os.getenv('DB_USER', 'postgres'), 'PASSWORD': os.getenv('DB_PASSWORD', 'secret'), 'HOST': os.getenv('DB_HOST', 'localhost'), 'PORT': os.getenv('DB_PORT', 5432), 'OPTIONS': { 'client_encoding': 'UTF8' } } } 

来自入口脚本的psql命令连接得很好,使用默认的5432端口。

现在,当Django尝试打开连接时,它使用了这个os.getenv('DB_PORT', 5432)调用的默认值5432 ,因为我没有明确地设置DB_PORT ENV,没有看到这样做的理由。

不在意见中,我已经在AWS ECS任务定义中明确地设置了DB_PORT ENV,并且惊讶地发现它工作正常! 无论什么原因(也许它是作为str传递的,而不是int )。

我通过添加/删除任务configuration中的ENV var定义来确认它2次。