从Docker容器将CSV文件写入本地主机

时间:2018-10-22 19:32:29

标签: python csv docker amazon-s3

我正在尝试建立一个非常基本的数据处理项目,在该项目中,我使用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

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()

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

2 个答案:

答案 0 :(得分:0)

您可以在docker容器中使用S3FS Fuse to mount the S3 bucket as a drive。基本上,这会在文件系统上创建一个实际上是S3存储桶的文件夹。您在该文件夹中保存/修改的所有内容都会反映在S3存储桶中。

如果删除docker容器或卸载驱动器,您的S3存储桶仍然完好无损,因此您不必担心通过正常docker使用来擦除S3存储桶中的文件。

答案 1 :(得分:0)

好,请记住,有关CSV期望的编辑输出到主机,我们确实对此设置有疑问。

您在Dockerfile中声明了两个VOLUME,这很好。这些是命名卷,非常适合在单个主机上上下移动的容器之间持久保存数据,但是您无法像从主机上访问普通文件系统那样轻松访问。

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

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

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

Read up on volumes。它们对于使用Docker至关重要,乍一看并不难,但是细节上有些陷阱。


关于上传到S3,我建议使用boto3库并在您的Python脚本中进行。如果发现更简单,也可以使用类似s3cmd的名称。