在docker容器中使用python脚本创建文件(pdf、xls)
尝试使用名为“scriptfile.py”的python脚本创建简单文件。当我运行它时,它会输出一个带有正弦波的pdf文件和一个包含3x10数据帧的xls文件,该数据帧最初是从一个名为“csv_file.csv”的csv文件导入的。此外,还显示了正弦波图。这一切都很好 现在,我已经基于Docker文档中的app.py示例创建了一个Dockerfile。我使用在docker容器中使用python脚本创建文件(pdf、xls),python,docker,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 tes
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")
问题:文件在哪里?有多种方法可以做到这一点,以下是一些方法 使用
docker cp
首先使用docker ps-a
计算您的集装箱ID,然后执行以下操作:
docker cp <containerid>:/app /tmp/mydir
现在,以如下方式运行容器:
docker run -p 4000:80 testrun
现在做:
docker inspect -f '{{ .Mounts }}' <containerid>
如您所见,有一条路径:
/var/lib/docker/volumes/511961D95CD5DE9A3AFE3358C7B9AF3EABD50179846FDEBD9C882D50C7FFEE7/_数据
这就是容器的/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/
上找到您的文件。不要对.py
等普通文件使用添加
。如果您发现自己经常更改scriptfile.py
(比更改pip install
命令更频繁),那么将COPY
和WORKDIR
行放在运行pip install
之后会对您有所帮助。这样,您就不必在每次更改scriptfile.py
时都使用pip
重新安装。
[{volume 511961d95cd5de9a32afe3358c7b9af3eabd50179846fdebd9c882d50c7ffee7 /var/lib/docker/volumes/511961d95cd5de9a32afe3358c7b9af3eabd50179846fdebd9c882d50c7ffee7/_data /app local true }]
docker run -it -v /tmp/share/:/tmp -p 4000:80 testrun