Используя Docker и Python, как получить доступ к CSV-файлу, созданному в томе? - PullRequest
0 голосов
/ 05 ноября 2019

Редактировать

Добавлены предложения от daudnadeem.

  1. Создана папка в каталоге с моим Dockerfile с именем temp_folder.
  2. Обновлена ​​последняя строка файла Python: df.to_csv('/temp_folder/temp.csv').
  3. Запустил сборку Docker, а затем новую команду запуска docker run -v temp_folder:/temp_folder alexd/myapp ..

У меня есть очень простой пример Python с использованием Docker. Код работает нормально, но я не могу понять, как получить доступ к файлу CSV, созданному кодом Python. Я создал том в Docker и использовал docker inspect, чтобы попытаться получить доступ к CSV-файлу, но я не уверен в синтаксисе и не могу найти в Интернете пример, который имеет смысл для меня.

Python Code

import pandas as pd
import numpy as np 
import os

df = pd.DataFrame(np.random.randint(0, 100, size=(100, 4)), columns=['A', 'B', 'C', 'D'])

df.to_csv('temp.csv')

Dockerfile

FROM python:3.7.1

RUN mkdir -p /var/docker-example

WORKDIR /var/docker-example

COPY ./ /var/docker-example

RUN pip install -r requirements.txt

ENTRYPOINT python /var/docker-example/main.py

Команды Docker

$ docker build -t alexf/myapp -f ./Dockerfile .

$ docker volume create temp-vol

$ docker run -v temp-vol alexf/myapp .

$ docker inspect -f temp.csv temp-vol
temp.csv

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Давайте все упростим, если ваша единственная цель - понять, как работают тома и где найти файл на хосте, созданный кодом Python внутри контейнера.

Dockerfile:

FROM python:3.7.1

RUN mkdir -p /var/docker-example

WORKDIR /var/docker-example

COPY . /var/docker-example

ENTRYPOINT python /var/docker-example/main.py

main.py - создаст /tmp/temp.txt внутри контейнера с hi внутри

with open('/tmp/temp.txt', 'w') as f:
    f.write('hi')

Docker команды (запустить внутрипапка проекта):

Изображение сборки: docker build -t alexf/myapp .

Использовать именованный объем vol, который сопоставлен с /tmp папкой внутри контейнера:

Запустить контейнер: docker run -d -v vol:/tmp alexf/myapp

Проверить том: docker inspect vol [ { "CreatedAt": "2019-11-05T22:07:02+02:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/vol/_data", "Name": "vol", "Options": null, "Scope": "local" } ]

Команды Bash запускаются на хосте докера

sudo ls /var/lib/docker/volumes/vol/_data
temp.txt

sudo cat /var/lib/docker/volumes/vol/_data/temp.txt
hi

Можно использоватьтакже связать монтирования и анонимные тома для достижения того же результата.

Документы

0 голосов
/ 05 ноября 2019

Ваш "temp.csv" живет по эфемерному изображению докера. Поэтому для того, чтобы вы могли получить к нему доступ вне образа докера, вам лучше всего предоставить том.

В каталоге, где находится ваш файл Docker, создайте папку с именем this_folder * 1003. *

Затем, когда вы запустите свой образ, подключите этот том к папке внутри вашего контейнера. docker run -v this_folder:/this_folder <image-name>

Затем измените этот код на:

import pandas as pd
import numpy as np 
import os

df = pd.DataFrame(np.random.randint(0, 100, size=(100, 4)), columns=['A', 'B', 'C', 'D'])

df.to_csv('/this_folder/temp.csv')

"this_folder" теперь«том», который является взаимно доступным для вашего док-контейнера и хост-машины. Так что за пределами вашего док-контейнера, если вы ls /this_folder вы должны увидеть temp.csv живет там сейчас.

Если вы не хотите монтировать том, вы можете загрузить файл куда-нибудь и загрузить его позже. Но в локальной среде просто смонтируйте папку и используйте ее для обмена файлами между вашим контейнером и вашим локальным компьютером.

Редактирование

, когда с докером дела идут не так, как планировалось, вы можете захотетьчтобы получить к нему доступ в интерактивном режиме. Это означает «ssh'ing в ваш докер контейнер»

Вы делаете это с помощью: docker run -it pandas_example /bin/bash

Когда я вошел в систему, я увидел, что файл 'temp.csv' создается вта же папка, что и main.py

Теперь вам решать вопрос дальше. Вам нужно переместить файл 'temp.csv' в каталог, который используется совместно с вашим локальным компьютером.

FROM python:3.7.1

RUN pip3 install pandas

COPY test.py /my_working_folder/

CMD python3 /my_working_folder/test.py

Для быстрого исправления добавьте

import subprocess
subprocess.call("mv temp.csv /temp_folder/", shell=True)

в конец основного.py. Но это не рекомендуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...