Относительный путь в контейнере / томе 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 ответ
Да, вы на правильном пути с точки зрения использования томов. Я бы разделил его на три части:
- Ваш код Python работает в одном контейнере
- Объем, который разделяется между вашими контейнерами Python и одним или несколькими другими контейнерами.
- Контейнер "копирования данных", который ежедневно копирует последние данные в общий том.
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, что именно то, что вы хотели.
Надеюсь, это поможет.