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

Сломанный по умолчанию: почему вы должны избегать большинства примеров DockerFile

Когда пришло время упаковать свое заявление на Python в документ докера, естественная вещь, которую нужно сделать … Теги с Python, Docker, Devops.

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

К сожалению, эти простые, легкие примеры часто разбиты различными способами, некоторые очевидные, некоторые меньше так. Чтобы продемонстрировать только некоторые из способов, которыми они сломаны, я собираюсь:

  1. Начните с примера Dockerfile Это подходит довольно высоко на некоторых поисках Google.
  2. Показать, как это сломано.
  3. Дайте некоторые предложения о том, как сделать его менее сломанным.

Сломан по умолчанию

Рассмотрим следующее Dockerfile , который я нашел, ищете примеры докерезации Python. Я сделал некоторые незначительные изменения, чтобы замаскировать свое происхождение, но иначе оно одинаково:

# DO NOT USE THIS DOCKERFILE AS AN EXAMPLE, IT IS BROKEN
FROM python:3

COPY yourscript.py /

RUN pip install flask

CMD [ "python", "./yourscript.py" ]

Некоторые проблемы с этим DockerFile

Сколько разных проблем вы можете место на этом изображении?

Проблема № 1: Невоспроизводимые сборки Re Python версия

Первое, что нужно заметить, это то, что это Dockerfile основывается на Python: 3 изображение. На момент написания это установится Python 3.7, но в какой-то момент он переключится на установку Python 3.8.

В этом пункте восстановления изображения будет переключаться на другую версию Python, что может нарушить программное обеспечение: незначительное изменение в вашем коде может привести к развертыванию, которое нарушает производство.

Решение: Использовать Python: 3,7,3 растяжка В качестве базового изображения для вывода версии и OS. Или, Python: 3,7 растяжка Если вы чувствуете себя менее обеспокоенным о моментах выпуска. Смотрите мою статью для Выбор базового изображения для Python Для более подробной информации о вариантах изображений.

Проблема № 2: Невоспроизводимые сборки повторных зависимостей.

Точно так же колбу Установлен без версий, поэтому каждый раз, когда изображение будет восстановлено потенциально новая версия колбу (или одно из его зависимостей или одно из его зависимостей зависимостей) изменится. Если они совместимы, отлично, но нет никакой гарантии.

Решение: Создать требования .txt с переходно-закрепленными версиями всех зависимостей, например. Используя Pip-Tools , Поэзия или Пипнв Отказ

Проблема № 3: Изменения в исходном коде, недействительный кэш сборки

Если вы хотите быстрые сборки, вы хотите положиться на кеширование слоя докера. Но копировав в файл перед запуском Установка PIP Все более поздние слои недействительны – это изображение будет восстановлено с нуля каждый раз.

Решение: Копировать в файлах только тогда, когда они сначала нужны Отказ

Проблема № 4: работает как root, что небезопасно

По умолчанию Docker контейнеры работают в качестве корня, что является риском безопасности.

Решение: Это намного лучше для Запустите как пользователь без root И сделайте это в самом изображении, чтобы вы не слушали порыты <1024 или выполняете другие операции, которые требуют подмножества разрешений корня.

Несколько лучший образ

Вот несколько лучший – хотя до сих пор не идеально-докер, который обращается к вопросам выше:

FROM python:3.7.3-stretch

COPY requirements.txt /tmp/

RUN pip install -r /tmp/requirements.txt

RUN useradd --create-home appuser
WORKDIR /home/appuser
USER appuser

COPY yourscript.py .

CMD [ "python", "./yourscript.py" ]

Даже если результирующее изображение было то, что вы хотели бы бежать в производстве – и он почти наверняка не! – Это изображение все еще недостаточно.

Например, вам также нужно регулярно обновлять требования .txt Под контролируемым образом, чтобы получить обновления безопасности и исправления ошибок, и вам нужно Регулярно восстанавливайте ваши изображения без кэширования, чтобы получить обновления безопасности Отказ

И есть еще много улучшений, которые вы могли бы сделать, чтобы сделать это ближе к Ready-Ready Python контейнер Отказ

Будьте осторожны, что вы учитесь у

Сломанное изображение докера может привести к производственным отключателям, и создание лучших практик намного сложнее, чем кажется. Так что не просто скопируйте первый пример, который вы найдете в Интернете: сделайте свое исследование и проводите время Чтение о лучших практиках Отказ

Слишком много, чтобы узнать, и не знаю, с чего начать? Узнайте практические методы разработки программного обеспечения в неделю, подписав на мою рассылку.

Оригинал: “https://dev.to/itamarstpythonspeed/broken-by-default-why-you-should-avoid-most-dockerfile-examples-10n3”