Это часть второй в серии при принятии простого проекта Python от локального сценария к производству. Частично говоря, я говорил очче, я столкнулся с преобразованием старого проекта из Python 2 в Python 3.
Эта часть перейдет, как я поставил свой процесс Python, его входы и его выходы в контейнер докеров и сделали изображение, публично доступное на Dockerhub Отказ
Требования к тому, что я не пойду здесь. Перейдите в Docker.com и следуйте инструкциям там
- Скачать Docker
- Создайте идентификатор докера
- Войдите с вашим докеренным идентификатором на Dockerhub
Докер это платформа контейнеризации. Контейнеризация – это способ упаковки подразделений кода с их зависимостями, чтобы у них есть все, что им нужно, чтобы работать в изоляции.
Использование Docker может помочь исправить проблему «Работает на моей машине», и написание докеризованного кода является отличным способом поощрения вдумчивых практик кода. Контейнеры Docker должны быть простыми, ответственными как можно меньше, и зависят от как можно меньше внешних.
Docker Image vs docker контейнер
На протяжении всего этого поста и онлайн вы увидите условия Контейнер
и изображение
. изображение
в основном является снимок вашего принризованного кода, созданный при использовании Docker Build
Команда – больше на что ниже. Docker Images Начните контейнер при использовании Docker Run
на этом изображении. Итак, Контейнер
это бегущий экземпляр изображение
Отказ
Я решил присоединить мой писатель CSV с предыдущего поста в этой серии, чтобы я мог легко переместить его между средами.
Для этого мне нужен докер. DockerFile – это текстовый файл, который не имеет расширения файла.
Вот что выглядит DockerFile для моего Python Code:
FROM python:3.7 ARG export_file=goodreads.csv COPY $export_file goodreads_export.csv COPY converter.py / CMD ["python", "./converter.py"]
ОТ
По ключевому слову IRE здесь указывает зависимость. Контейнеры Docker не имеют языков автоматически загружены. Чтобы получить доступ к Python для запуска кода, нам нужно попросить изображения включать Python: 3.7
.
Примечание на реестры Docker: Реестр Docker Docker IS Docker Hub Отказ Если документ докера доступен на DockerHub, вам не нужно указывать URL-адрес при вытягивании или нажатии от Docker Repo. Вам просто нужен имя пользователя и имя REPO. Например, вы можете вытащить изображение Docker с этого поста с помощью команды Докер тянуть Thejessleigh/GoodReads-libib-Converter
Отказ Если вы используете другой реестр, вам нужно сказать Docker, куда идти. Например, если вы используете набережной, вы сделаете Докер тянуть quay.io/example-username/test-docker-repo
Отказ
Зависимость Python в My DockerFile не имеет имени пользователя, потому что это Официальный Репо размещена на Dockerhub.
Arg
Arg
объявляет аргумент. Это единственная инструкция в DockerFile, которая может предшествовать От
, хотя я предпочитаю иметь От
сначала приходите к последовательности.
В приведенном выше примере я объявляю Arg
export_file
и дать ему по умолчанию. Он ожидает, что файл называется GoodReads.Csv
в том же каталоге, что и DockerFile. Если я хочу пройти в чем-то другим, я проказываю его использовать другое имя файла с --build-arg. = export_file = my_goodreads_export.csv
при строительстве изображения.
Скопировать
Скопировать
и Добавить
Дублируйте содержимое файла на изображение докера. Здесь я импортирую входной файл, а также фактический код Python, который выполняет изображение Docker.
Скопировать
принимает два аргумента:
- Расположение файла, которое вы надеваете на изображение
- Расположение файла внутри Образ докера
Таким образом, какой файл я включаю в качестве CSV для преобразования, будет называться GoodReads_Export.csv
внутри контейнера докера. Это нефте, потому что это означает, что независимо от того, что я создаю изображение Docker, с именем файла всегда будет последовательным. Мне не нужно беспокоиться о том, чтобы сделать код Python обрабатывать разные имена или пути. Это всегда может искать ./goodreads_export.csv
Отказ
Есть некоторые тонкие различия между Скопировать
и Добавить
что @ryanwhodes уже написал о, поэтому я оставлю свой пост здесь Отказ
Обновление сентября 2019 года: Похоже, что этот пост больше не доступен на dev.to Поэтому я заменил встроенный пост с помощью ссылки Archive.org.
БЕГАТЬ
Беги
выдает инструкцию, выполняемую и совершающуюся как часть изображения. Если бы я был докеренным проектом Python, который необходим для установки внешних пакетов, я мог бы использовать БЕГАТЬ
к PIP Установить
эти зависимости. Тем не менее, Converter.py
Это очень простой процесс, который не нуждается в внешних пакетах, поэтому мне не нужно запускать что-либо как часть моего процесса сборки.
CMD
Там может быть только один CMD
Инструкция за Dockerfile. Если DockerFile содержит несколько CMD
S, только последний будет выполняться.
CMD
Является ли команда, которую вы собираетесь сделать изображение, когда вы запускаете экземпляр в качестве контейнера. Он не выполнен как часть процесса сборки для изображения. CMD
отличается от Беги
в этом случае.
Теперь у нас есть все необходимое для создания образа докера для нашего кода Python из DockerFile.
Как указано выше, докер изображение
Это инертный снимок среды, который готов выполнить команду или программу, но еще не выполнил эту команду.
Построить с помощью вышеуказанного докерафила, мы бежим
docker build --build-arg=export_file=goodreads_export.csv -t goodreads-libib-converter .
--build-arg
Рассказывает Docker создать изображение с помощью файла под названием GoodReads_Export.csv
Переопределить ожидание по умолчанию GoodReads.Csv
Отказ
-t goodreads-libib-конвертер
«Теги» изображение как GoodReads-libib-конвертер
Отказ Вот как вы создаете свой контейнер с читаемым человеком Репозиторий
имя.
.
Рассказывает Docker искать DockerFile для создания текущего каталога.
После этого я сделаю это, я вижу, что изображение было успешно создано путем проверки моего списка изображений.
> docker image list REPOSITORY TAG IMAGE ID CREATED SIZE goodreads-libib-converter latest 1234567890 12 seconds ago 924MB
Теперь, когда у меня есть изображение
У меня есть автономная среда, способная запустить мою программу, но на самом деле она не выполнила основную процедуру, указанную с CMD
все же. Вот как я это делаю:
docker run goodreads-libib-container
Я вижу операторы отладки печати, которые у меня есть в моем Converter.py
Файл выполнить, поэтому я знаю, сколько строк CSV преобразуется. Когда я провел программу локально, он создал выходной файл под названием libib_export.csv
Отказ Однако, когда я проверяю содержимое моего каталога сейчас, он там нет. Как это полезно!?
Доступ к файлам, написанным
Я больше не управляю кодом Python в каталоге, который я был раньше. Я бегу на это внутри Контейнер докера. Поэтому любые файлы, которые выписаны, также будут храниться внутри Контейнер докера. Выходной файл не делает мне много хорошего там!
Я использую контейнер Docker локально, поэтому все, что мне нужно сделать, это найти контейнер и скопировать выходной файл из его докеренного местоположения на место, которое я на самом деле хочу этого.
docker cp container_id:/libib_export.csv ~/outputs/libib_export.csv
Это извлекает результируемый вывод CSV из Converter.py
и помещает его где-нибудь, я могу получить доступ к нему.
Я могу выяснить Container_id
(или человеческое читаемое имя) с
> docker ps -a CONTAINER ID IMAGE COMMAND CREATED NAMES e00000000000 goodreads-libib-export "python ./converter.…" 24 seconds ago naughty_mcclintock
Да, Naughty_MCClintock на самом деле является процедурно созданным именем для контейнера, который я работал с локально.
Копирование файла из контейнера к желаемому расположению в порядке для местной среды, но ограничено использованием, если я когда-либо хочу взять этот проект к производству. Есть и другие, лучшие варианты для работы с выходными файлами из контейнеров Docker, но мы попадем в это ✨ в другом взносе в этой серии ✨
После того, как мы запустим контейнер, чтобы подтвердить, что он работает, мы, вероятно, создаем новое изображение, основанное на изменениях, которые он сделан при выполнении. Мы готовим изображение, которое мы хотим подталкивать во внешний реестр докеров, например, DockerHub.
При совершении документа Docker нам нужно указать реестр (если это что-то другое, чем Dockerhub), имя автора, имя репозитория и имя тега.
docker commit -m "Working Python 3 image" naughty_mcclintock thejessleigh/goodreads-libib-converter:python3
Мой Docker Commit
Был успешен, поэтому я вижу хеш-вывод SHA256 в моем терминале. Создание сообщения Commit, конечно, необязательно. Но мне нравится делать это, чтобы продолжать организовано.
ПРИМЕЧАНИЕ НА МЕГИИ ОБНОВЛЕНИЯ DOCKER: Когда вы вытащите изображение Docker, и вы не указываете тег, он будет использовать тег по умолчанию (обычно последние
). Теги так, как вы можете отслеживать изменения в вашем проекте без перезаписи предыдущих версий. Например, если вы (по какой-то причине) все еще используете Python 2, вы можете получить доступ к изображению Python 2, запустив Docker Pult Thejessleigh/GoodReads-libib-Converter: Python2
. Прямо сейчас : python3.
и Последние
Теги на моем Rocker Reppo одинаковы, но вы можете тянуть либо один.
Теперь, когда у меня есть изображение, я хочу потушить в мир, я могу подтолкнуть его до Dockerhub.
Во-первых, мне нужно войти в Dockerhub и создать репозиторий. Репозитории требуют имя, и должно иметь краткое описание, которое детализирует цель проекта и длительное описание, которое объясняет зависимости, требования, строить аргументы и т. Д. Вы также можете сделать Docker Repository Private Private.
Однажды я сделал это, я бегу Docker Push
, который отправляет последний коммит проекта и тег, который я указал на внешний реестр. Если вы не укажете тег, этот толчок переопределят Последние
Тег в вашем репозитории.
docker push thejessleigh/goodreads-libib-converter:python3
Если вы идете в мой профиль dockerhub Вы можете увидеть GoodReads-libib-конвертер
Проект и вытащите как Python 2, так и Python 3 воплощения.
Теперь, когда у меня есть рабочий докер, я хочу перевести его в производство, чтобы кто-нибудь мог преобразовать библиотеку GoodReads CVV в библиотеку Libib CVV. Я собираюсь пойти об этом, используя AWS, который требует немного установки.
Следующий рассрочка в этой серии пойдет на настройку учетной записи AWS IAM, настройка awscli
и настроить локальные профили и создание ведра S3, которое может получить доступ к учетной записи IAM.
Оригинал: “https://dev.to/thejessleigh/dockerizing-a-simple-python-process-2gdk”