pg_dump 错误 docker 但仍然成功执行

pg_dump error in docker but still executes successfully

我已经容器化了一个 python 脚本,该脚本旨在 运行 pg_dump 到数据库并将生成的文件上传到服务器。我 运行 遇到的问题是我看到了消息 could not find a "pg_dump" to execute 在我的终端中,但它似乎 运行 无论如何都成功了。例如,如果我 运行 下面的代码我得到输出:

could not find a "pg_dump" to execute
pg_dump (PostgreSQL) 11.10

我想弄清楚为什么会在我的终端上打印此消息,以及它是否表示我没有看到的更大问题。如上所示,我仍然清楚地得到了我的输出,所以我对这条消息的含义感到很困惑。

Dockerfile:

FROM postgres:11.10-alpine

LABEL maintainer="Foo"

COPY *.py /

ADD requirements.txt /

RUN apk add postgresql-client

# Install python 3
RUN apk add --no-cache python3 \
  && python3 -m ensurepip \
  && pip3 install --upgrade pip setuptools \
  && rm -r /usr/lib/python*/ensurepip && \
  if [ ! -e /usr/bin/pip ]; then ln -s pip3 /usr/bin/pip ; fi && \
  if [[ ! -e /usr/bin/python ]]; then ln -sf /usr/bin/python3 /usr/bin/python; fi && \
  rm -r /root/.cache

RUN pip install --no-cache-dir -r /requirements.txt

ENTRYPOINT ["python3", "./main.py"]

Python代码:

# main method ...
command = "pg_dump --version"

process = Popen(command, shell=True, env={
    "PGPASSWORD": password
})
process.wait()

我的命令:

docker run -v ~/.aws/:/home/.aws/ -v /tmp/:/tmp/ -e HOME=/home/ <my-image>

正如您观察到的,这里没有什么大问题。

接下来的问题是:

process = Popen(command, shell=True, env={
    "PGPASSWORD": password
})

env 覆盖系统中的默认值 environment variables,这会让您遇到问题。事实上,您的系统中有 2 个 pd_dump,一个在 /usr/local/bin/pg_dump 中,另一个在 /usr/bin/pg_dump 中,由 apk add postgresql-client 安装。

要使您的 python 代码的行为与登录 shell 的行为相同(我的意思是 运行 pg_dumpdocker exec -it ...),您应该更改接下来的代码包含默认环境变量:

import os
process = Popen(command, shell=True, env={**os.environ, "PGPASSWORD": password})