gpt4 book ai didi

bash - 无法使用带有 docker exec 的 psql 命令行从文件运行查询

转载 作者:行者123 更新时间:2023-12-02 18:05:49 25 4
gpt4 key购买 nike

我有一个 bash 文件应该使 postgres docker 容器在线,然后运行 ​​.sql 文件来创建数据库。但它抛出了错误。

psql: error: provision-db.sql: No such file or directory

我已经检查了路径,并且该文件存在于这个 bash 脚本的同一级别。以下是我的 bash 文件的内容。

#!/usr/bin/env bash

docker-compose up -d db

# Ensure the Postgres server is online and usable
until docker exec -i boohoo.postgres pg_isready --host="${POSTGRES_HOST}" --username="${POSTGRES_USER}"
do
echo "."
sleep 1
done

docker exec -i boohoo.postgres psql -h "${POSTGRES_HOST}" -U "${POSTGRES_USER}" -a -q -f provision-db.sql

这是 provision-db.sql 文件。

DROP DATABASE "boo-hoo";
CREATE DATABASE "boo-hoo";
GRANT ALL PRIVILEGES ON DATABASE "boo-hoo" TO postgres;

这是docker-compose.yml的一部分

version: '3.3'

services:
db:
container_name: boohoo.postgres
hostname: postgres.boohoo
image: postgres
ports:
- "15432:5432"
environment:
POSTGRES_USER: "postgres"
POSTGRES_PASSWORD: "postgres"

最佳答案

简短版

这行得通

cat provision-db.sql | docker exec -i boohoo.postgres bash -c 'psql -U ${POSTGRES_USER} -w -a -q -f -'

长版

这里有很多东西

1) 为什么下面的命令找不到 provision-db.sql

docker exec -i boohoo.postgres psql -h "${POSTGRES_HOST}" -U "${POSTGRES_USER}" -a -q -f provision-db.sql

因为 provision-db.sql 在您的主机上而不是在您的容器中。因此,当你在容器内执行psql命令时,它找不到文件

2) 为什么我的第一个解决方案不起作用?

cat provision-db.sql | docker exec -i boohoo.postgres psql -h "${POSTGRES_HOST}" -U "${POSTGRES_USER}" -a -q -f - 假设 provision-db.sql 应该可以解决问题

这是因为变量 ${POSTGRES_USER}${POSTGRES_PASSWORD}在您的主机上进行评估,我猜他们没有设置在那里。另外,我忘了指定 -w标记以避免密码提示

3) 为什么这样行得通?

cat provision-db.sql | docker exec -i boohoo.postgres bash -c 'psql -U ${POSTGRES_USER} -w -a -q -f -'

好吧,让我们一步一步来。

首先,我们打印provision-db.sql的内容, 它驻留在主机上到 stdout 并通过 | 将其通过管道传输到下一个命令.

docker-exec在指定的容器中执行命令 ( boohoo.postgres )。通过指定 -i标记我们允许来自您主机的标准输入进入容器中的标准输入 <- 这很重要。

在容器中,我们执行bash -c这只是一个包装器,以避免评估主机上的 bash 变量。我们需要容器中的变量并将其放入单引号中,我们可以做到这一点。

docker-exec boohoo.postgres bash -c "echo $POSTGRES_USER"

评估名为 POSTGRES_USER 的主机环境变量。

docker-exec boohoo.postgres bash -c "echo $POSTGRES_USER"

评估名为 POSTGRES_USER 的容器环境变量。

接下来我们只需按顺序获取 postgres 命令即可。

psql -U ${POSTGRES_USER} -w -a -q -f -

-U指定用户
-w不要求密码
-q安静地做
-f -处理你从 stdin 得到的任何东西

关于bash - 无法使用带有 docker exec 的 psql 命令行从文件运行查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59637432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com