Amr*_* E. 1 python postgresql pg-dump python-3.x docker
我已经容器化了一个 python 脚本,该脚本旨在pg_dump在数据库上运行并将生成的文件上传到服务器。我遇到的问题是我
could not find a "pg_dump" to execute在终端中看到了该消息,但无论如何它似乎都运行成功。例如,如果我运行下面的代码,我会得到输出:
could not find a "pg_dump" to execute
pg_dump (PostgreSQL) 11.10
Run Code Online (Sandbox Code Playgroud)
我想弄清楚为什么这条消息打印在我的终端上,以及它是否表明了我没有看到的更大问题。我仍然清楚地得到我的输出,如上所示,所以我对这条消息的含义感到非常困惑。
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"]
Run Code Online (Sandbox Code Playgroud)
Python代码:
# main method ...
command = "pg_dump --version"
process = Popen(command, shell=True, env={
"PGPASSWORD": password
})
process.wait()
Run Code Online (Sandbox Code Playgroud)
我的命令:
docker run -v ~/.aws/:/home/.aws/ -v /tmp/:/tmp/ -e HOME=/home/ <my-image>
Run Code Online (Sandbox Code Playgroud)
正如您所观察到的,这里没有大问题。
接下来的问题是:
process = Popen(command, shell=True, env={
"PGPASSWORD": password
})
Run Code Online (Sandbox Code Playgroud)
env覆盖系统中的默认设置environment variables,这会让您遇到问题。事实上,pd_dump你的系统中有 2 个,一个在 中/usr/local/bin/pg_dump,另一个在/usr/bin/pg_dump由apk add postgresql-client.
为了使 python 代码的行为与登录 shell 行为相同(我的意思是运行 with pg_dump)docker exec -it ...,您应该更改代码以包含默认环境变量:
import os
process = Popen(command, shell=True, env={**os.environ, "PGPASSWORD": password})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1241 次 |
| 最近记录: |