Docker Compose 和 Postgres 连接被拒绝
Docker Compose & Postgres Connection Refused
我知道这个问题已被问过一百万次,而且我已经阅读了尽可能多的答案。他们似乎都得出了一个结论(db hostname 是容器服务名称)。
我让它在我的实际代码库中工作,但是当我将 ffmpeg
安装添加到 Dockerfile 时它开始失败。无需执行任何其他操作,只需通过 apt-get install -y ffmpeg
安装 FFPMEG 就会导致我的 python 代码收到连接被拒绝的消息。如果我删除了 ffmpeg 安装行,那么我的代码就可以很好地连接到数据库。尽管重新 运行 容器会触发可怕的连接被拒绝错误。
所以我创建了一个快速示例应用程序,这样我就可以 post 在这里尝试了解正在发生的事情。但是现在无论我做什么,这个示例代码都不会连接到数据库。
所以这里开始 - 在此先感谢您的帮助:
myapp.py
# import ffmpeg
import psycopg2
if __name__ == "__main__":
print("Starting app...")
# probe = ffmpeg.probe("131698249.mp4")
# print(probe)
try:
connection = psycopg2.connect(
user="docker", password="docker", host="db", port="5432", database="docker")
cursor = connection.cursor()
postgreSQL_select_Query = "select * from test_table"
cursor.execute(postgreSQL_select_Query)
print("Selecting rows from table using cursor.fetchall")
records = cursor.fetchall()
print("Print each row and it's columns values")
for row in records:
print(row)
cursor.close()
connection.close()
except (Exception, psycopg2.Error) as error:
print("Error while fetching data from PostgreSQL", error)
Dockerfile
WORKDIR /usr/src/app
COPY requirements.txt .
RUN python -m pip install -r requirements.txt
COPY . .
CMD ["python", "myapp.py"]
docker-compose.yml
version: '3.8'
services:
db:
container_name: pg_container
image: postgres:14.1
restart: always
environment:
POSTGRES_USER: docker
POSTGRES_PASSWORD: docker
POSTGRES_DB: docker
ports:
- "8000:5432"
expose:
- "5432"
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
- pg_data:/var/lib/postgresql/data
myapp:
container_name: myapp
build:
context: .
dockerfile: ./Dockerfile
restart: "no"
depends_on:
- db
volumes:
pg_data:
如果我构建 运行 代码:docker compose up --detach
一切都已构建并开始。数据库启动并填充 init.sql
中的 table/data(此处未包含)
应用程序容器启动并执行代码,但立即失败并显示 Connection refused
错误。
但是,如果我从我的电脑 运行: psql -U docker -h localhost -p 8000 -d docker
它连接没有任何错误,我可以按预期查询数据库。
但是容器中的应用程序无法连接,如果我 运行 容器 docker run -it myapp /bin/bash
然后从容器内部 运行: psql -U docker -h db -p 5432 -d docker
我得到连接被拒绝错误。
如果有人有任何想法或想法,我将不胜感激。我已经为此纠结了三天了。
看来我已经解决了。我确定我以前试过这个,但无论在 docker-compose.yml
中添加 networks
部分似乎都解决了这个问题。
我还必须按照 David Maze 的评论建议执行第二个 docker-compose up -d
。但是两者的结合似乎解决了我的问题。
这里是我更新的 docker-compose.yml
为了完全清楚:
version: '3.8'
services:
postgres-db:
container_name: pg_container
image: postgres:14.1
restart: always
environment:
POSTGRES_USER: docker
POSTGRES_PASSWORD: docker
POSTGRES_DB: docker
ports:
- "5500:5432"
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
networks:
- dock-db-test
myapp:
container_name: myapp
build:
context: .
dockerfile: ./Dockerfile
restart: "no"
depends_on:
- db
networks:
- dock-db-test
networks:
dock-db-test:
external: false
name: dock-db-test
我知道这个问题已被问过一百万次,而且我已经阅读了尽可能多的答案。他们似乎都得出了一个结论(db hostname 是容器服务名称)。
我让它在我的实际代码库中工作,但是当我将 ffmpeg
安装添加到 Dockerfile 时它开始失败。无需执行任何其他操作,只需通过 apt-get install -y ffmpeg
安装 FFPMEG 就会导致我的 python 代码收到连接被拒绝的消息。如果我删除了 ffmpeg 安装行,那么我的代码就可以很好地连接到数据库。尽管重新 运行 容器会触发可怕的连接被拒绝错误。
所以我创建了一个快速示例应用程序,这样我就可以 post 在这里尝试了解正在发生的事情。但是现在无论我做什么,这个示例代码都不会连接到数据库。
所以这里开始 - 在此先感谢您的帮助:
myapp.py
# import ffmpeg
import psycopg2
if __name__ == "__main__":
print("Starting app...")
# probe = ffmpeg.probe("131698249.mp4")
# print(probe)
try:
connection = psycopg2.connect(
user="docker", password="docker", host="db", port="5432", database="docker")
cursor = connection.cursor()
postgreSQL_select_Query = "select * from test_table"
cursor.execute(postgreSQL_select_Query)
print("Selecting rows from table using cursor.fetchall")
records = cursor.fetchall()
print("Print each row and it's columns values")
for row in records:
print(row)
cursor.close()
connection.close()
except (Exception, psycopg2.Error) as error:
print("Error while fetching data from PostgreSQL", error)
Dockerfile
WORKDIR /usr/src/app
COPY requirements.txt .
RUN python -m pip install -r requirements.txt
COPY . .
CMD ["python", "myapp.py"]
docker-compose.yml
version: '3.8'
services:
db:
container_name: pg_container
image: postgres:14.1
restart: always
environment:
POSTGRES_USER: docker
POSTGRES_PASSWORD: docker
POSTGRES_DB: docker
ports:
- "8000:5432"
expose:
- "5432"
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
- pg_data:/var/lib/postgresql/data
myapp:
container_name: myapp
build:
context: .
dockerfile: ./Dockerfile
restart: "no"
depends_on:
- db
volumes:
pg_data:
如果我构建 运行 代码:docker compose up --detach
一切都已构建并开始。数据库启动并填充 init.sql
中的 table/data(此处未包含)
应用程序容器启动并执行代码,但立即失败并显示 Connection refused
错误。
但是,如果我从我的电脑 运行: psql -U docker -h localhost -p 8000 -d docker
它连接没有任何错误,我可以按预期查询数据库。
但是容器中的应用程序无法连接,如果我 运行 容器 docker run -it myapp /bin/bash
然后从容器内部 运行: psql -U docker -h db -p 5432 -d docker
我得到连接被拒绝错误。
如果有人有任何想法或想法,我将不胜感激。我已经为此纠结了三天了。
看来我已经解决了。我确定我以前试过这个,但无论在 docker-compose.yml
中添加 networks
部分似乎都解决了这个问题。
我还必须按照 David Maze 的评论建议执行第二个 docker-compose up -d
。但是两者的结合似乎解决了我的问题。
这里是我更新的 docker-compose.yml
为了完全清楚:
version: '3.8'
services:
postgres-db:
container_name: pg_container
image: postgres:14.1
restart: always
environment:
POSTGRES_USER: docker
POSTGRES_PASSWORD: docker
POSTGRES_DB: docker
ports:
- "5500:5432"
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
networks:
- dock-db-test
myapp:
container_name: myapp
build:
context: .
dockerfile: ./Dockerfile
restart: "no"
depends_on:
- db
networks:
- dock-db-test
networks:
dock-db-test:
external: false
name: dock-db-test