Docker python输出csv文件

时间:2019-12-12 16:56:39

标签: python docker dockerfile

我有一个脚本python wich应该输出一个文件csv。我试图将此文件保存在当前的工作目录中,但没有成功。

这是我的Dockerfile

FROM python:3.6.4

RUN apt-get update && apt-get install -y libaio1 wget unzip

WORKDIR /opt/oracle 
RUN wget https://download.oracle.com/otn_software/linux/instantclient/instantclient- 
basiclite-linuxx64.zip && \ unzip instantclient-basiclite-linuxx64.zip && rm 
-f instantclient-basiclite-linuxx64.zip && \ cd /opt/oracle/instantclient* 
&& rm -f jdbc occi mysql *README jar uidrvci genezi adrci && \ echo 
/opt/oracle/instantclient > /etc/ld.so.conf.d/oracle-instantclient.conf && 
ldconfig 
RUN pip install --upgrade pip

COPY . /app 
WORKDIR /app

RUN pip install --upgrade pip 
RUN pip install pystan 
RUN apt-get -y update && python3 -m pip install cx_Oracle --upgrade 
RUN pip install -r requirements.txt

CMD [ "python", "Main.py" ]

并使用以下命令运行容器

docker container run -v $pwd:/home/learn/rstudio_script/output image

有人可以帮助我吗?谢谢。

2 个答案:

答案 0 :(得分:0)

您的脚本Main.py可能没有尝试写入/home/learn/rstudio_script/output。由于Dockerfile中的最后一个/app指令,因此容器中的工作目录为WORKDIR。您可以在运行时使用--workdir覆盖它,但随后也必须更改CMD

一种解决方案是让脚本将文件写入/output/,然后像这样运行它:

docker container run -v $PWD:/output/ image

答案 1 :(得分:0)

将卷绑定为仅将容器上的1个文件保存到主机上是不明智的做法。

相反,您应该利用copy命令:

docker cp <containerId>:/file/path/within/container /host/path/target

您可以将此命令设置为在docker运行后使用bash自动执行。

类似这样:

#!/bin/bash

# this stores the container id
CONTAINER_ID=$(docker run -dit img)

docker cp $CONTAINER_ID:/some_path host_path

如果您坚持使用绑定卷,那么正如其他人所指出的那样,问题很可能是您的python脚本没有将csv输出到正确的路径。