簡體   English   中英

從docker容器將csv文件寫入本地主機

[英]Writing csv files to local host from a docker container

我正在嘗試建立一個非常基本的數據處理項目,我使用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

您可以使用S3FS Fuse將S3存儲桶作為驅動程序安裝在docker容器中。 這基本上會在您的文件系統上創建一個實際上是S3存儲桶的文件夾。 您在該文件夾中保存/修改的任何內容都將反映在S3存儲桶中。

如果您刪除了docker容器或卸載了驅動器,那么您的S3存儲桶仍然完好無損,因此您無需擔心通過正常的docker使用來擦除S3存儲桶中的文件。

好的,有了關於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這樣的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM