Я люблю 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”