在Docker容器内使用python脚本创建文件(pdf,xls)

时间:2019-07-12 22:28:26

标签: python docker

尝试使用名为“ scriptfile.py”的python脚本创建简单文件。运行它时,它将输出带有正弦波的pdf和包含3x10数据帧的xls文件,该文件最初是从称为“ csv_file.csv”的csv文件导入的。此外,还显示了正弦波图。一切正常。

现在,我已经基于Docker文档中的app.py示例创建了一个Dockerfile。我使用

构建图像
sudo docker build --tag=testrun .

并使用

运行它
sudo docker run -p 4000:80 testrun

控制台输出是正常的,但是没有创建文件,也没有显示绘图。 Dockerfile和scriptfile.py的代码如下。

它显示为

FROM python:3

WORKDIR /app
COPY . /app

ADD scriptfile.py /

RUN pip install matplotlib
RUN pip install xlwt
RUN pip install pandas

EXPOSE 80

ENV NAME DockerTester

CMD ["python","/scriptfile.py"]

scriptfile.py读取

import math
import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_csv('csv_file.csv', sep=",", header=None)
df.to_excel(r'xlx_file.xls')

print("plotting ...")

sinusoid=[]
for i in range(100):
    sinusoid.append(math.sin(i))

f = plt.figure()
plt.plot(sinusoid)
plt.show()
f.savefig("sin.pdf")
plt.close()

print("... success")

问题:文件在哪里?

1 个答案:

答案 0 :(得分:1)

执行此操作的方法有多种,这里有一些。

使用docker cp

首先使用docker ps -a找出您的Containerid,然后执行以下操作:

docker cp <containerid>:/app /tmp/mydir

您将在/tmp/mydir的主机上找到内容。

使用Dockerfile VOLUME

将此行添加到Dockerfile之后的COPY中:

VOLUME /app

现在像运行容器一样运行容器:

docker run -p 4000:80 testrun

现在做:

docker inspect -f '{{ .Mounts }}' <containerid>

<containerid>获得docker ps -a的地方。您将看到类似的内容:

[{volume 511961d95cd5de9a32afe3358c7b9af3eabd50179846fdebd9c882d50c7ffee7 /var/lib/docker/volumes/511961d95cd5de9a32afe3358c7b9af3eabd50179846fdebd9c882d50c7ffee7/_data /app local  true }] 

您会看到一条路径:

  

/ var / lib / docker / volumes / 511961d95cd5de9a32afe3358c7b9af3eabd50179846fdebd9c882d50c7ffee7 / _data

这是容器的/app目录内容所在的位置。

使用docker run -v

更改您的python脚本以写入/app以外的其他位置,例如f.savefig("/tmp/sin.pdf")

然后像这样运行docker:

docker run -it -v /tmp/share/:/tmp -p 4000:80 testrun

现在,您将在/tmp/share/的主机上找到文件