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_dump
和 docker exec -it ...
),您应该更改接下来的代码包含默认环境变量:
import os
process = Popen(command, shell=True, env={**os.environ, "PGPASSWORD": password})
我已经容器化了一个 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_dump
和 docker exec -it ...
),您应该更改接下来的代码包含默认环境变量:
import os
process = Popen(command, shell=True, env={**os.environ, "PGPASSWORD": password})