当前位置: 首页 > 知识库问答 >
问题:

正在等待服务数据库在Docker中运行的其他服务之前运行[重复]

湛文乐
2023-03-14

我正在尝试运行我的应用程序,其中depends_on我的Postgresql在Docker中,假设我的数据库Postgresql现在没有运行

并且在我的docker-compose.yml中:

version: "3"
services:
  myapp:
    depends_on:
      - db
    container_name: myapp
    build:
      context: .
      dockerfile: Dockerfile
    restart: on-failure
    ports:
      - "8100:8100"

  db:
    container_name: postgres
    restart: on-failure
    image: postgres:10-alpine
    ports:
      - "5555:5432"
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: 12345678
      POSTGRES_DB: dev

如何使MyApp运行直到DB服务知道我的DB正在运行??

共有1个答案

束高雅
2023-03-14

depends_on的文档说明:

depends_on在启动myapp之前不会等待db“就绪”-仅在启动之前。

因此,在运行应用程序之前,您必须检查数据库是否已就绪。

#!/bin/sh
# wait-for-postgres.sh

set -e

host="$1"
shift
cmd="$@"

until PGPASSWORD=$POSTGRES_PASSWORD psql -h "$host" -U "postgres" -c '\q'; do
  >&2 echo "Postgres is unavailable - sleeping"
  sleep 1
done

>&2 echo "Postgres is up - executing command"
exec $cmd
command: ["./wait-for-postgres.sh", "db", "python", "app.py"]

还有诸如wait-for-it、dockerize或wait-for等工具。

然而,这些解决方案有一些局限性,Docker说:

最好的解决方案是在应用程序代码中执行此检查,无论在启动时还是在连接因任何原因丢失时都是如此。

以下是我如何在JavaScript中使用重试策略:

  async ensureConnection () {
    let retries = 5
    const interval = 1000

    while (retries) {
      try {
        await this.utils.raw('SELECT \'ensure connection\';')
        break
      } catch (err) {
        console.error(err)
        retries--
        console.info(`retries left: ${retries}, interval: ${interval} ms`)
        if (retries === 0) {
          throw err
        }
        await new Promise(resolve => setTimeout(resolve, interval))
      }
    }
  }
 类似资料:
  • 我试图在我的中使用waet-for-it来等待mysql准备就绪,然后再创建依赖于它的服务。这是我的: 尝试使用docker compose运行此操作时出现以下错误: 开始集成tests_mysql_1错误 错误:对于集成-tests_mysql_1无法开启服务mysql:OCI运行时创建失败:container_linux.go:348:启动容器进程导致"exec: \"./ wait-for-

  • 问题内容: 当前,我通过使用以下文件运行一个简单的Docker容器。 Docker文件 docker-compose.yml docker-compose.override.yml 我使用Windows映像通过以下命令创建容器,并且可以通过http:// localhost:9091 / 访问它。 我想使用HTTPS而非http访问我的应用程序。 我需要遵循哪些步骤? 问题答案: 您需要配置Web

  • 注:如果你不喜欢使用sudo,你可以查看这里非root用户运行 这里有一个例子,使用数据卷在两个CouchDb之间共享相同的数据容器,这个可以用于热升级,测试不同版本的CouchDB数据等等。 创建第一个数据库 现在我们创建/var/lib/couchdb作为数据卷 COUCH1=$(sudo docker run -d -p 5984 -v /var/lib/couchdb shykes/cou

  • 这个例子的目的是向您展示如何构建一个预装Riak的docker镜象。 创建Dockerfile 创建一个空文件Dockerfile $ touch Dockerfile 接下来,定义你想要来建立你镜像的父镜像。我们将使用Ubuntu(tag:最新版),从Docker Hub中下载: # Riak # # VERSION 0.1.0 # Use the Ubuntu base ima

  • 非常简单,没有任何修饰,redis是使用一个连接附加到一个web应用程序。 创建一个redis docker容器 首先,我们先为redis创建一个Dockerfile FROM ubuntu:12.10 RUN apt-get update RUN apt-get -y install redis-server EXPOSE 6379 ENT

  • 使用asyn/wait vs wait有什么区别task.run() 等待任务。运行示例- 异步等待示例-