Относительный путь в контейнере / томе Docker для скрипта Python

Я новичок в Docker, но добился успеха в Dokcerizing некоторый существующий код Python с использованием панели инструментов Docker для Windows 10.

В настоящее время у меня есть эта настройка:

изображение рабочего кода Python в контейнере Docker

Это делается с помощью Dockerfile:

FROM python:2.7.13
WORKDIR /root
COPY ./requirements.txt /root/requirements.txt
RUN pip install -r requirements.txt
COPY . /root
CMD ["python", "main.py"]

и весь мой код находится в контейнере с кучей файлов CSV и.pkl. Дело в том, что файлы CSV и.pkl меняются ежедневно, поэтому после некоторого чтения я думаю, что могу разделить эти файлы на том или, может быть, даже на отдельный контейнер, который я могу изменять и загружать каждый день, не меняя основной скрипт на python как его 1.4G по размеру и моя скорость загрузки составляет 40 кбит / с (в лучшем случае).

Изображение настройки контейнера, которое я хотел бы

Поэтому мне интересно, как бы я сослался на другой контейнер / том, чтобы я мог получить доступ к файлам CSV и /pkl в моем основном коде Python? На данный момент все находится в одном каталоге, так что нет проблем, я просто называю имя.csv/.pkl, и это работает

#open the local .csv file
data = pd.read_csv(csv_select)
#open the local .pkl file
pickled_list = pickle.load(open(can_cat+".pkl","rb"))

Как бы я сослаться на приведенный выше код, чтобы открыть файл CSV / PKL из отдельного контейнера?

Я прочитал кучу сообщений stackru и документации докера, но не могу понять, как заставить его работать, любая помощь будет оценена.

1 ответ

Решение

Да, вы на правильном пути с точки зрения использования томов. Я бы разделил его на три части:

  1. Ваш код Python работает в одном контейнере
  2. Объем, который разделяется между вашими контейнерами Python и одним или несколькими другими контейнерами.
  3. Контейнер "копирования данных", который ежедневно копирует последние данные в общий том.

1. Общий том

Создать тома с помощью Docker легко. Что особенно хорошо, так это то, что вы можете создать том с определенным именем:

docker volume create data-volume

Итак, здесь мы создали data-volume названный объем Затем вы можете смонтировать это на любой контейнер, используя команду как это:

docker run --rm -v data-volume:/data my-container-image

Итак, здесь мы запускаем контейнер из образа Docker my-container-image и монтируем data-volume объем при /data в этом контейнере.

Ваш код Python может легко читать нужные файлы из этого каталога.eg /data или вы можете изменить точку монтирования по мере необходимости.

2. Копирование измененных данных в том

Следующим шагом будет создание простого приложения, которое сможет копировать последние изменения в этот каталог. Снова допустим, что это приложение копирует последние данные в /data в собственной файловой системе. По сути, мы хотим приложение, которое делает:

cp $TODAYS_DATA.csv $TODAYS_DATA.pkl /data

Мы могли бы запустить это приложение в контейнере, а также убедиться, что контейнер имеет data-volume установлен в data например:

docker run --rm data-volume:/data my-data-copying-app

Этот контейнер может быть очень простым, что-то вроде:

FROM alpine:latest
COPY ./todaysdata /todaysdata

Затем вы можете запустить его, используя следующее:

docker run --rm data-volume:/data my-data-copy-image "/bin/sh -c cp -r /todaysdata/* /data/"

По сути, вы просто запускаете контейнер с командой, чтобы скопировать данные с сегодняшнего дня в /data, Так как /data на самом деле это объем, последние данные сразу же передаются вашему приложению Python, что именно то, что вы хотели.

Надеюсь, это поможет.

Другие вопросы по тегам