Docker 等待 postgresql 运行

新手上路,请多包涵

我在我的项目中使用带有 django 的 postgresql。我将它们放在不同的容器中,问题是我需要在运行 django 之前等待 postgres。此时我正在使用 sleep 5command.sh django 容器文件中进行操作。我还发现 netcat 可以做到这一点,但我更喜欢没有额外软件包的方式。 curlwget 不能这样做,因为它们不支持 postgres 协议。有没有办法做到这一点?

原文由 Quba 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 971
2 个回答

您的解决方案 tiziano 的问题是默认情况下未安装 curl,我想避免安装其他东西。无论如何,我做了bereal所说的。如果有人需要,这是脚本。

 import socket
import time
import os

port = int(os.environ["DB_PORT"]) # 5432

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
while True:
    try:
        s.connect(('myproject-db', port))
        s.close()
        break
    except socket.error as ex:
        time.sleep(0.1)

原文由 Quba 发布,翻译遵循 CC BY-SA 3.0 许可协议

我花了几个小时调查这个问题,我得到了解决方案。 Docker depends_on 只考虑服务启动运行另一个服务。之所以发生这种情况,是因为一旦 db 启动,服务应用程序就会尝试连接到您的 db ,但它还没有准备好接收连接。所以你可以在应用服务中检查 db 健康状态等待连接。这是我的解决方案,它解决了我的问题。 :) 重要提示:我使用的是 docker-compose 2.1 版。

 version: '2.1'

services:
  my-app:
    build: .
    command: su -c "python manage.py runserver 0.0.0.0:8000"
    ports:
       - "8000:8000"
    depends_on:
      db:
        condition: service_healthy
    links:
      - db
    volumes:
      - .:/app_directory

  db:
    image: postgres:10.5
    ports:
      - "5432:5432"
    volumes:
      - database:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5

volumes:
  database:

在这种情况下,无需创建 .sh 文件。我希望它可以帮助你们;)cya

原文由 Vinicius Chan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题