docker 如何在没有提示的情况下给予pg_dump密码?

njthzxwz  于 2023-02-07  发布在  Docker
关注(0)|答案(1)|浏览(131)

我有下面的Python代码可以在本地生成一个转储文件。当我使用pg_dump命令时,我想在没有数据库连接提示密码的情况下将其停靠,而且我也不知道我会在dockerfile中给出什么来代替postgres_bin = r "C:\Program Files\PostgreSQL \13\bin"

import os
import paramiko
import subprocess

postgres_bin = r"C:\Program Files\PostgreSQL\13\bin"
dump_file = "database_dump.sql"

with open(dump_file, "w") as f:
    result = subprocess.call([os.path.join(postgres_bin, "pg_dump"), "-Fp", "-d", "XXX", "-U", "XXX", "-h", "XXX", "-p", "XXX"], stdout=f)

transport.close()

此代码在本地工作。我希望有相同的代码工作,而不必在提示中给出密码,我有本地。
我该怎么做呢?

---更新----

我更新了下面的代码。这段代码可以在提示符下工作。但是当我用"-w"和env = {'PGPASSWORD '取消注解时:'secret '}出现主机名无法转换的错误:未知服务器错误。

import os
import paramiko
import subprocess

print("Import has been done !")

postgres_bin = r"C:\Program Files\PostgreSQL\13\bin"
dump_file = "database_dump.sql"

with open(dump_file, "w") as f:
        result = subprocess.call([
                os.path.join(postgres_bin, "pg_dump"), 
                "-Fp", 
                "-d", 
                "anonymedev", 
                "-U", 
                "pgsqladmin", 
                "-h", 
                "hostname", 
                "-p", 
                "32045", 
                # '-w'
                ], 
                # env={'PGPASSWORD': 'secret'},
                stdout=f
                )
hxzsmxv2

hxzsmxv21#

您可以使用PGPASSWORDPGPASSFILE环境变量,如the documentation中所述。
例如,要以用户“postgres”和密码“secret”的身份转储数据库“example”,我可以编写:

PGHOST=127.0.0.1 \
PGUSER=postgres \
PGPASSWORD=secret \
PGDATABASE=example \
pg_dump

我可以将密码存储在一个文件中,而不是使用PGPASSWORD环境变量;在这种情况下,我们需要按照“The Password File“中的描述格式化文件:

echo 127.0.0.1:5432:example:postgres:secret

然后使用PGPASSFILE环境变量引用该文件:

PGPASSFILE=pgpass \
pg_dump -h 127.0.0.1 -U postgres example

如果你在Python中运行pg_dump,那么为了设置一个环境变量,你需要在os.environ中设置键,或者使用subprocess.callenv参数。
使用env参数为单个subprocess.call调用设置环境,如果希望现有环境变量在子进程中可见,则必须显式包含这些变量:

with open(dump_file, "w") as f:
    result = subprocess.call(
        [
            os.path.join(postgres_bin, "pg_dump"),
            "-Fp",
            "-d",
            "XXX",
            "-U",
            "XXX",
            "-h",
            "XXX",
            "-p",
            "XXX",
        ],
        env=os.environ | {'PGPASSWORD': 'secret'},
        stdout=f,
    )

(Note这里的dict union syntax需要Python 3.9或更高版本)。
或者,您可以更新os.environ,这将使变量可用于所有后续子进程:

os.environ['PGPASSWORD'] = 'secret'

with open(dump_file, "w") as f:
    result = subprocess.call(
        [
            os.path.join(postgres_bin, "pg_dump"),
            "-Fp",
            "-d",
            "XXX",
            "-U",
            "XXX",
            "-h",
            "XXX",
            "-p",
            "XXX",
        ],
        stdout=f,
    )

相关问题