如何解决如何从 Docker 容器访问 CSV 输出?
Python 程序生成 CSV 输出。目前,能够在主机上运行 test.py 并生成 sample_output.csv。
然而,当通过 Docker Containers 实现程序时,在定位 sample_output.csv 文件时遇到了困难。下面是 Dockerfile 和 requirements.txt 文件。
numpy==1.19.4
pandas==1.2.0
python-dateutil==2.8.1
pytz==2020.5
scipy==1.5.4
six==1.15.0 // -> requirements.txt
FROM python:3
WORKDIR /demo
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python","-u","./test.py"] // -> Dockerfile
Docker Image 可以通过运行 Docker build -t imagename 生成。但是,在运行 docker run imagename 时,并没有生成 csv 文件。
希望在基于 docker 镜像运行 Docker 容器后寻找 sample_output.csv 文件的帮助。
//test.py
import pandas as pd
import numpy as np
import os
from scipy.stats import uniform,exponweib
from scipy.special import gamma
from scipy.optimize import curve_fit
N_SUBSYS = 30
STEPS = 100
LIMIT = 101*STEPS
times = np.arange(0,LIMIT,STEPS)
if not os.path.exists('./output'):
os.mkdir('./output')
print("Directory")
class WeibullFailure():
def __init__(self):
N_TRAINS = 92
LOWER_BETA = 0.9
RANGE_BETA = 0.3
LOWER_LOGSCALE = 4
RANGE_LOGSCALE = 1.5
LOWER_SIZE = 4
RANGE_SIZE = 8
gensize = N_TRAINS * int(uniform.rvs(LOWER_SIZE,RANGE_SIZE))
genbeta = uniform.rvs(LOWER_BETA,RANGE_BETA)
genscale = np.power(10,uniform.rvs(LOWER_LOGSCALE,RANGE_LOGSCALE))
self.beta = genbeta
self.eta = genscale
self.size = gensize
def generate_failures(self):
return exponweib.rvs(
a=1,loc=0,c=self.beta,scale=self.eta,size=self.size
)
def __repr__(self):
string = f"Subsystem ~ ({self.size} Instances)"
string += f" Weibull({self.eta:.2f},{self.beta:.4f})"
return string
def get_cumulative_failures(failure_times,times):
cumulative_failures = {
i: np.histogram(ft,times)[0].cumsum()
for i,ft in failure_times.items()
}
cumulative_failures = pd.DataFrame(cumulative_failures,index=times[1:])
return cumulative_failures
def fit_failures(cumulative_failures,subsystems):
fitted = {}
for i,x in cumulative_failures.items():
size = subsystems[i].size
popt,_ = curve_fit(
lambda x,a,b: np.exp(a)*np.power(x,b),x.index,x.values
)
fitted[i] = (np.exp(-popt[0]/popt[1])*size,popt[1])
return fitted
def kl_divergence(p1,p2):
em_constant = 0.57721 # Euler-Mascheroni constant
eta1,beta1 = p1
eta2,beta2 = p2
e11 = np.log(beta1/np.power(eta1,beta1))
e12 = np.log(beta2/np.power(eta2,beta2))
e2 = (beta1 - beta2)*(np.log(eta1) - em_constant/beta1)
e3 = np.power(eta1/eta2,beta2)*gamma(beta2/beta1 + 1) - 1
divergence = e11 - e12 + e2 + e3
return divergence
subsystems = {i: WeibullFailure() for i in range(N_SUBSYS)}
failure_times = {i: s.generate_failures() for i,s in subsystems.items()}
cumulative_failures = get_cumulative_failures(failure_times,times)
fitted = fit_failures(cumulative_failures,subsystems)
divergences = {
i: kl_divergence(f,[subsystems[i].eta,subsystems[i].beta])
for i,f in fitted.items()
}
expected_failures = {i: np.power(times[1:]/s.eta,s.beta)*s.size
for i,s in subsystems.items()}
expected_failures = pd.DataFrame(expected_failures,index=times[1:])
modeled_failures = {i: np.power(times[1:]/f[0],f[1])*subsystems[i].size
for i,f in fitted.items()}
modeled_failures = pd.DataFrame(modeled_failures,index=times[1:])
cols = ['eta','fit_eta','beta','fit_beta','kl_divergence','n_instance']
out = pd.concat([
pd.DataFrame({i: [s.size,s.eta,s.beta] for i,s in subsystems.items()},index=['n_instance','eta','beta']).T,pd.DataFrame(fitted,index=['fit_eta','fit_beta']).T,pd.Series(divergences,name='kl_divergence')
],axis=1)[cols]
out.to_csv('./output/sample_output.csv')
if not os.path.exists('./output/sample_output.csv'):
print("Hello")
解决方法
我建议您将输出重定向到控制台而不是像这样的文件:
from io import StringIO
output = StringIO()
out.to_csv(output)
print(output.getvalue())
而不是你的容器
docker run <container> > output.csv
,
Docker 容器根据定义与主机隔离。当你在容器中运行某些东西时,它会留在容器中。
您可以将主机目录挂载到您认为脚本输出应该出现的容器中。您可以使用 -v
(音量)选项执行此操作:
docker run -v /host/path:/container/path ...
可以指定多个卷:
docker run -v /host/path:/container/path -v /another/host/path:/another/container/path ...
之后,包含所有内容的主机目录将出现在容器中,就像它在主机上一样,如果您的程序要在其中添加或替换某些内容,您将看到它。
UPD:查看您的输出文件应该在 test.py
中的 /demo/output
,以便您可以在那里挂载一些主机目录,例如,您的当前目录:docker run -v $(pwd):/demo/output ...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。