Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何在运行docker之前启动postgres_Postgresql_Docker_Docker Compose - Fatal编程技术网

Postgresql 如何在运行docker之前启动postgres

Postgresql 如何在运行docker之前启动postgres,postgresql,docker,docker-compose,Postgresql,Docker,Docker Compose,我非常不好意思问这个问题,因为这似乎是一个非常基本的问题,但不知何故,我在文档中找不到答案 我有一个使用postgres的django应用程序。在docker compose.yaml中有以下要求: version: "2" services: database: image: postgres:9.5 environment: POSTGRES_DB: ${POSTGRES_DATABASE} POSTGRES_USER: ${POSTGRES_USER}

我非常不好意思问这个问题,因为这似乎是一个非常基本的问题,但不知何故,我在文档中找不到答案

我有一个使用postgres的django应用程序。在
docker compose.yaml
中有以下要求:

version: "2"

services:

database:
  image: postgres:9.5
  environment:
    POSTGRES_DB: ${POSTGRES_DATABASE}
    POSTGRES_USER: ${POSTGRES_USER}
    POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    POSTGRES_DATA: /var/lib/postgresql/data/pgdata
当我运行docker映像时:
docker run-it--name myapp myimage
它不断重复:

The database is not ready.
wait for postgres to start...
我在分离模式下运行postgres:
docker run-it-d postgres:9.5

但是它没有帮助

您启动容器的方式一切正常,但是,您遇到的问题是因为DB和应用程序容器正在一个接一个地启动,但是,DB容器需要准备DB、执行迁移等等,因此,当你的应用程序容器试图到达你的DB容器时,它还没有准备好,这就是为什么你会遇到这个错误


您有两个选择,一个是编辑应用程序Dockerfile并添加等待30-60秒左右,或者您可以自己启动数据库,等待它准备就绪,然后启动应用程序容器。

请查看此项

第二个例子正好是您需要的:

您可以使用
add
COPY
创建sh脚本并将其添加到应用程序容器中:

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

set -e

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

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

>&2 echo "Postgres is up - executing command"
exec $cmd
然后修改docker-compose.yaml,如下所示:

version: "2"
services:
  web:
    build: .
    ports:
      - "80:8000"
    depends_on:
      - "db"
    command: ["./wait-for-postgres.sh", "db", "python", "app.py"]
  db:
    image: postgres
command
中,您正在修改容器的默认命令。 当然,
“python”,“app.py”
部分取决于您如何启动应用程序。
对于Java,它可能是例如
“Java”、“-jar”、“my app.jar”
等。

使用Docker Compose 2.1语法,您可以指定控制容器启动:

version: '2.1'

services:
    application:
        depends_on:
            database:
                condition: service_healthy

查看示例Dockerfile,以使用healthchecks构建Postgres。

但它告诉我找不到角色“我的用户名”。在db:部分我现在有:数据库:图像:postgres:9.5环境:postgres_db:“django_db”postgres_用户:“我的用户名”postgres_密码:“我的密码”我应该以某种方式‘告诉’ti postgres图像创建
我的用户名
用户,对吗?但是怎么做呢?请检查一下。您可以通过设置环境变量(如
POSTGRES\u PASSWORD
)来设置管理员凭据。您可以检查如何在docker compose中设置环境变量。