不能在 postgres 容器中 运行 编写脚本

Can't run script inside postgres container

假设我们需要在生产环境中 运行 第二个 postgres 实例。其中第一个 (postgres-one) 已经 运行ning 并且其中的数据库和数据很少。现在我想更新我的 docker-compose.yaml 文件并为第二个 (postgres-two) 添加配置。此外,我必须从 postgres-one 获取一些数据库信息并将其复制到 postgres-two。这是我如何努力实现这一目标的:

docker-compose.yaml

postgres-two:
    image: postgres:12.5
    depends_on:
      postgres-one:
        condition: service_started
    ...
    ports:
      - "5433:5432"
    command: bash -c "chmod +x /usr/local/bin/init.sh && /usr/local/bin/init.sh"
    volumes:
      - ./data/postgres-two/init-db/init.sh:/usr/local/bin/init.sh

init.sh

#!/bin/bash

# allows you to skip the password prompt for pg_dump
echo "postgres-one:5432:dbname1_one:dbuser1_one:dbpass1_one" > ~/.pgpass
echo "postgres-one:5432:dbname2_one:dbuser2_one:dbpass2_one" >> ~/.pgpass

chmod 600 ~/.pgpass

# gets the data from external database & copies it to internal
pg_dump -h postgres-one -U dbuser1_one dbname1_one | psql -h localhost -U dbuser1_two -d dbname1_two
pg_dump -h postgres-one -U dbuser2_one dbname2_one| psql -h localhost -U dbuser2_two -d dbname2_two

但是当我 运行 这个时,我得到了错误:

psql: error: could not connect to server: Connection refused Is the server running on host "localhost" (127.0.0.1) and accepting TCP/IP connections on port 5432?

我已经试过了w/o-h localhost,我记得它给了我这个:

psql: error: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

如果我在 init.sh 的开头添加 find /var/run/postgresql/ -name .s.PGSQL.5432,它什么也不会显示。因此,据我所知,我无法继续使用 psql,因为 postgres 服务器目前未 运行ning。当然我不能用 postgres / pg_ctl 命令 运行 因为它们不能被 root 执行:

"root" execution of the PostgreSQL server is not permitted.

当然还有 docker 容器 运行 默认情况下作为 root 用户,如果我更改用户它也会给我错误,例如:

chmod: changing permissions of '/usr/local/bin/init.sh': Operation not permitted

我做错了什么吗?或者也许我可以获取转储并以其他方式应用它们......不知何故?

我认为服务器由于卷映射而无法启动, 可以参考这个yml, https://github.com/khezen/compose-postgres/blob/master/docker-compose.yml

Nvm,我通过将 init.sh 脚本放入 docker-entrypoint-initdb.d 文件夹解决了这个问题。但是后来我也遇到了 pg_dump 的访问问题,因为出于某种原因 .pgpass 在我的情况下不起作用。对于那些将面临同样问题的人,我用 PGPASSWORD env 修复了它:

PGPASSWORD="dbpass1_one" pg_dump -h postgres-one -U dbuser1_one dbname1_one | psql -h localhost -U dbuser1_two -d dbname1_two