从 docker 容器将 csv 文件写入本地主机

Sky*_*lue 6 python csv amazon-s3 docker

我正在尝试建立一个非常基本的数据处理项目,在其中使用docker在EC2上创建ubuntu环境,安装python,获取输入csv,执行一些简单的数据操作,然后将数据输出到文件夹中的新csv输入在哪里。我已经能够在本地以及 ec2 上成功运行我的 python 代码,但是当我使用 docker 容器运行它时,数据似乎已被处理(我的脚本打印出数据),但结果未保存在运行结束。我的 dockerfile 中是否缺少某个命令,导致结果无法保存?或者,有没有办法可以将输出直接保存到 S3 存储桶?

编辑:输入文件的路径是“/home/ec2-user/docker_test/data”,代码的路径是“/home/ec2-user/docker_test/code”。数据处理后,我希望将结果作为新文件写入主机上的“/home/ec2-user/docker_test/data”目录中。

Dockerfile:

FROM ubuntu:latest

RUN apt-get update \
    && apt-get install -y --no-install-recommends software-properties-common \
    && add-apt-repository -y ppa:deadsnakes/ppa \
    && apt-get update \
    && apt-get install -q -y --no-install-recommends python3.6 python3.6-dev python3-pip python3-setuptools \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

VOLUME /home/ec2-user/docker_test/data
VOLUME /home/ec2-user/docker_test/code

WORKDIR /home/ec2-user/docker_test/

COPY requirements.txt ./

RUN cat requirements.txt | xargs -n 1 -L 1 python3.6 -m pip install --no-cache-dir

COPY . .

ENV LC_ALL C.UTF-8
ENV LANG=C.UTF-8

CMD python3.6 main.py
Run Code Online (Sandbox Code Playgroud)

Python脚本:

import pandas as pd
import os
from code import processing

path = os.getcwd()

def main():
    df = pd.read_csv(path + '/data/table.csv')
    print('input df: \n{}'.format(df))
    df_out = processing.processing(df)
    df_out.to_csv(path + '/data/updated_table.csv', index = False)
    print('\noutput df: \n{}'.format(df_out))


if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

编辑:我一直在使用“docker run docker_test”运行dockerfile

blu*_*res 1

好吧,明白了,通过编辑有关将 CSV 输出到主机的期望,我们确实在如何设置方面遇到了问题。

您已经在 Dockerfile 中声明了两个 VOLUME,这很好。这些被命名为“卷”,非常适合在单个主机上上下移动的容器之间保存数据,但您无法像主机上的普通文件系统一样轻松地进入。

如果您希望该文件显示在主机上,则可以在运行时创建绑定安装卷,它将主机文件系统中的路径映射到 Docker 容器文件系统中的路径。

docker run -v $(pwd):/home/ec2-user/docker_test/data docker_test会这样做。$(pwd)是一个表达式,如果您在 *nix 系统上运行该命令,则该表达式的计算结果为您当前的工作目录。请注意这一点并根据需要进行调整(例如,如果您使用 Windows 作为主机)。

通过以这种方式设置卷,当在容器文件系统中您想要的位置创建 CSV 时,您可以在主机上相对于您映射它的位置访问它。

阅读大量书籍。它们对于使用 Docker 至关重要,乍一看并不难掌握,但细节中存在一些问题。


关于上传到 S3,我建议使用该boto3库并在 Python 脚本中执行此操作。s3cmd如果您觉得更简单,您也可以使用类似的东西。