如何从 Docker 容器访问 CSV 输出?

如何解决如何从 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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-