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

Самый быстрый способ запустить Python в Docker

Каковы наименьшие усилия, необходимые для того, чтобы доставить немного Python в контейнер Docker? Tagged с Python, Docker.

Я люблю Python. Я думаю, что это прекрасно разработанный язык с философией, который я действительно ценю как разработчик, пытающийся сделать вещи. Просто запустите это в командной строке: Python -m это

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Что не так хорошо, так это упаковка Python. Это неловко, это сбивает с толку – Это становится лучше, но все еще не так приятно, как на других языках (Ruby, Java, JavaScript).

Docker – это коллекция различных функций Linux – пространства имен, CGROUPS, Union File -System – собраны таким образом, чтобы вы могли упаковать и распространять программное обеспечение в языковом агентском контейнере. Docker – отличный способ обойти боль упаковки Python.

Чтобы установить его, перейдите к https://www.docker.com/ И по ссылке «Get Docker» выберите версию для вашей операционной системы.

Достаточно докера

Так. Что наименьшее, с чем мы можем сойти с рук? Или, что меньше всего я могу написать, чтобы проиллюстрировать это? Ну, если мы используем Onbuild Python Docker Image, затем не так много.

Представьте, что у нас есть приложение Super Specple Flask, в котором есть только один маршрут, возвращая фиксированную строку (привет, мир?). Нам нужно очень мало, но у нас есть зависимость от колбы. Даже на моем Mac, с последней ОС (ОК, пока не высокая сьерра), установка Python по умолчанию не включает в себя Pip менеджер пакетов. Что за черт? Это включает в себя easy_install , так что я мог easy_install Pip , или, скорее, sudo easy_install pip Потому что это пойдет в глобальное место. Тогда я мог бы глобально установить колба Пакет тоже. WHOOP-DE-DOO. Какая версия теперь глобально установлена в моей системе? Кто знает! (?)

Давайте не будем этого делать. Давайте создадим наше Требования.txt файл:

echo Flask > requirements.txt

И наше приложение Flask:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello, World!'


if __name__ == '__main__':
    app.run(host='0.0.0.0')

И Тогда Давайте иметь Dockerfile слишком:

echo FROM python:onbuild >> Dockerfile

Построить это

Итак, давайте построим это:

$ docker build -t myapp.local .
Sending build context to Docker daemon  4.096kB
Step 1/1 : FROM python:onbuild
# Executing 3 build triggers...
Step 1/1 : COPY requirements.txt /usr/src/app/
 ---> Using cache
Step 1/1 : RUN pip install --no-cache-dir -r requirements.txt
 ---> Using cache
Step 1/1 : COPY . /usr/src/app
 ---> Using cache
 ---> 79fdf87107de
Successfully built 79fdf87107de
Successfully tagged myapp.local:latest

Это было? Это построено? Ага:

$ docker image ls myapp.local
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
myapp.local         latest              c58ad169cb28        4 seconds ago       700MB

Запустить его

Отлично, наше приложение находится внутри контейнера! Что дальше? Запустите контейнер таким образом:

$ docker run --rm myapp.local python server.py
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

Это говорит Docker командование запустить myapp.local Контейнер (который мы построили), чтобы удалить его, когда он останавливается ( - -rm ) и запустить команду python server.py внутри него. Удивительно! Так можем ли мы увидеть наше приложение сейчас?

Последняя часть

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

$ curl localhost:5000
curl: (7) Failed connect to localhost:5000; Connection refused

Нам нужно разоблачить порт за пределами контейнера, в котором он работает:

docker run --rm -p 5001:5000 myapp.local python server.py

-p Аргумент отображает ваш локальный 5001 порт в 5000 Внутри контейнера (они могут быть одинаковыми, но я сделал их разными, чтобы проиллюстрировать, где находятся хост и контейнер).

ОК, не совсем конец …

Поэтому я узнал, когда писал это:

Варианты изображения онбильцы устарели, и их использование не рекомендуется.

Это нормально – ты бы не использовал Onbuild изображение для чего -либо серьезного, и Dockerfile Это определяет, это очень легко понять. Проверьте это для себя и посмотрите, как это работает: https://github.com/docker-library/python/blob/f12c2d/3.6/jessie/onbuild/dockerfile

Мы можем заменить содержимое нашего Dockerfile со следующим и получите тот же результат:

FROM python

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY requirements.txt /usr/src/app/
RUN pip install --no-cache-dir -r requirements.txt

COPY . /usr/src/app

Я только что удалил Onbuild Директивы (плюс 3.6-Jessie Версия Python – мы можем просто взять последние).

Действительно конец

Так что это наш минимальный пример того, как запустить приложение Python с его зависимостью внутри контейнера Docker. Docker – удивительная технология, и неудивительно, что Компания это оценивается так Высоко Анкет В этом случае это обеспечивает для нас чистый способ избежать боли с упаковкой Python, но теперь у нас также есть изображение контейнера с нашим приложением, которое можно распространять и запускать на любую другую систему, которая может запускать Docker.

Оригинал: “https://dev.to/grahamlyons/the-quickest-way-to-run-python-in-docker-165”