我知道这个问题已经被问过一百万次了,而且我已经阅读了尽可能多的答案。他们似乎都得出了一个结论(db hostname 是容器服务名称)。
我让它在我的实际代码库中工作,但是当我添加 ffmpeg
时它开始失败安装到 Dockerfile。无需执行任何其他操作,只需通过 apt-get install -y ffmpeg
安装 FFPMEG会导致我的 python 代码收到连接被拒绝的消息。如果我删除了 ffmpeg 安装行,那么我的代码会很好地连接到数据库。虽然重新运行容器会触发可怕的连接被拒绝错误。
所以我创建了一个快速示例应用程序,这样我就可以在这里发布并尝试了解正在发生的事情。但是现在无论我做什么,这个示例代码都不会连接到数据库。
所以这里 - 提前感谢您的帮助: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
的表/数据进行填充。 (此处不包括)应用程序容器启动并执行代码,但立即失败并显示
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
我收到连接被拒绝错误。如果有人有任何想法或想法,我将不胜感激。我已经为此挣扎了三天。
最佳答案
看来我已经解决了。我确定我以前尝试过,但不管添加 networks
docker-compose.yml
的部分似乎解决了这个问题。
我还必须做第二个 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
关于python - Docker Compose 和 Postgres 连接被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71165628/