Рубрики
Без рубрики

Докеризация простого процесса Python

Быстрый прохождение написания документа DockerFile. Tagged Python, Docker, Учебник, объяснительный анализ.

Это часть второй в серии при принятии простого проекта 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”