非交互式 postgres 命令在 Ubuntu 机器中挂起

Non-interactive postgres command hangs in Ubuntu machine

我正在使用以下摘录创建一个 CircleCI 配置文件:

executors:
    ubuntu:
        machine:
            image: ubuntu-2004:202107-02
jobs:
    build:
        executor: ubuntu
        environment:
            PGUSER: postgres
            DATABASE_URL: postgresql://postgres@localhost:5432/postgres
            TERM: xterm
        steps:
            - checkout
            - run: sudo apt-get update
            - run: sudo apt-get install postgresql
            - run: psql -V
            - run: pg_isready
            - run: |
                psql \
                -d $DATABASE_URL \
                -c "CREATE TABLE test (name char(25));"
            - run: |
                psql \
                -d $DATABASE_URL \
                -c "INSERT INTO test VALUES ('John'), ('Joanna'), ('Jennifer');"
            - run: |
                psql \
                -d $DATABASE_URL \
                -c "SELECT * from test;"

pg_isready 之前的所有命令(包括 pg_isready)都会无错退出,但无论我尝试什么,下一个命令 (CREATE TABLE) 都会挂起。 CircleCI 日志显示此内容,没有进一步的输出:

#!/bin/bash -eo pipefail
psql \
-d $DATABASE_URL \
-c "CREATE TABLE test (name char(25));"

我使用的代码取自 CircleCI 的文档并稍作修改: https://circleci.com/docs/2.0/databases/

这种类型的工作对我来说是新的 – 我希望这是一个明显缺失的命令 – 在此先感谢!

发布我的答案以防其他人遇到此问题:我的具体问题是 psql 一直进入交互模式。这发生在任何 psql 命令上——而不仅仅是密码请求。这阻止了进程退出并继续下一个进程。

通过将我的命令传递给 cat,我能够解决 CircleCI 的问题。例如:

            - run:
                name: Create test database
                command: sudo -u postgres createdb testdb | cat

此外,关闭页面选项也可以,但看起来更冗长:psql -P pager=off

如果您发现更好的方法,请添加到本主题! (我尝试了环境变量,但无法让它们坚持下去。)