@davorg начал нить на FB Perl Community и Программисты Perl О Docker-Perl И, как и его сопровождающий, я просроченный поделиться некоторыми советами об этом, так что может написать их здесь:
Используйте пользовательское имя/тег для изображений Perl ты используешь
Как задокументировано в Docker Hub, можно использовать Perl
изображение с чем-то вроде
docker pull perl docker run -it perl perl -E 'say "hi there from Docker!"'
При этом достаточно для простых или исследовательских случаев, это неадекватно для разработки или сценариев развертывания, как Perl
Одни вытащит новейшее изображение Perl построить последней поддерживаемой версии Perl (которая является 5.32.0
сейчас Но может быть позже позже.) К счастью, Docker-Perl предоставляет Теги Чтобы указать конкретные версии (а также параметры, такие как : Threaded
) или варианты размера (например : Slim
) Так что можно также сделать
docker pull perl:5.32-buster docker run -it perl:5.32-buster perl -E 'say qq{hi again!}'
Есть еще одна забота, хотя: в то время как документы имеют теги, эти теги плавающий В том смысле, что они не всегда указывают на тот же нижний слой изображения при времени создания, поскольку теги могут быть обновлены, чтобы указать на другой слой. Это лучше всего видно в : Последние
Тег, какой документ использует по умолчанию при вызове изображений с их голыми именами, но это поведение также присутствует в любых других тегах, таких как : 5
который указывает в настоящее время на : 5.32.0
, но позже может быть обновлен, чтобы указать на : 5.32.1
или даже : 5.34.0
, когда Перл Манифест на Docker-library/Официальные изображения обновляется.
Эти теги также косвенно обновляются путем обновлений на их база картинки; Как Docker-Perl использует Buildpack-DEPS
или Debian: Slim
Базовые изображения, когда они обновляются для исправлений безопасности, эти патчи в конечном итоге пройдут в Perl
изображения, а также через Официальные изображения сборки сборки Отказ
Для случаев, требующих более тонкого контроля изображений, может быть полезно, чтобы затем использовать пользовательское имя изображения, тег или оба, при использовании Docker-Perl:
docker pull perl:5.32-slim-threaded-buster docker tag perl:5.32-slim-threaded-buster myorg/perl:5.32 docker run -it myorg/perl:5.32 perl -e 'printf "hello from myorg/perl v%vd!\n", $^V'
Это позволяет некоторую независимость для обновлений и разработок между Perl
Опубликовано на Docker Hub и мюрг
на заказ Perl
изображение:
# docker build -t myorg/myapp:dev . FROM myorg/perl:5.32 ADD . /app WORKDIR /app RUN cpanm --installdeps . CMD ["perl", "myapp.pl"] ...
Рассмотрите возможность сохранения местного/частного реестра для размещения Perl Perl
Использование изображений Perl (особенно в предыдущем разделе) означает, что они будут скопированы в локальный хранилище изображений хоста докера, обычно в /var/lib/docker/images
Но может варьироваться в зависимости от того, что Драйвер для хранения Ваш хост использует. Хотя это обычно достаточно в простых случаях, считайте, что основание Perl
Изображение обычно большая (около 700-800 МБ распаковано,), поэтому вытягивание этого изображения заново на несколько контейнерных хостов в сети, вероятно, будет расточительным.
Следовательно, обычно рекомендуется иметь какое-то местное или частное Реестр В хосте или в сети, если часто работают с контейнерами (и более, если подключение к Интернету медленнее/дорого.) Есть несколько подходов для этого, и я написал об этом раньше в моем старом блоге:
В наше время, хотя, есть еще варианты использования местных/частных реестров: например, если у вас есть кластер Kubernetes, работающих в вашей сети (или даже в качестве небольшой настройки, как Microk8s или внутренний кластер контейнеров Docker с использованием Добрый или K3D ,) обычно есть аддон Это позволяет локальному реестру в кластере. Вот Пример Для Microk8s, которые я продлил для моей собственной локальной сети, чтобы подавать под TLS Ingress :
microk8s enable registry microk8s kubectl apply -f - <
У меня есть СТАРСЕРГИПТ WildCard SSL Sert установлен и поддерживается на моих микроках через сертификат Так что это позволяет мне подтолкнуть к этому реестру в любом месте моей локальной сети, как
docker push myorg/perl:5.32 registry.home.example/myorg/perl:5.32 docker push myorg/myapp:dev registry.home.example/myorg/myapp:dev
и где-то еще, что может быть запущен Подман вместо:
podman run -it registry.home.example/myorg/perl:5.32 perl -V podman run -d registry.home.example/myorg/myapp:dev
Это также работает на авториге Dockerfile
S, особенно полезно при реализации рабочих процессов гитаупа:
# docker build -t myorg/mojo:8.65 # docker push myorg/mojo:8.65 registry.home.example/myorg/mojo:8.65 FROM registry.home.example/myorg/perl:5.32 RUN cpanm Mojolicious@8.65 EXPOSE 3000 CMD ["/usr/local/bin/mojo", "daemon"]
Для более сложных/производственных развертываний рассмотрите возможность использования Гавань или поставщики, такие как Amazon Ecr , Реестр контейнера Google или Красная набережная шляпа Отказ
Используйте контейнерную точку для правильных сигналов обработки в Perl
Это уже документировано в Официальные изображения Документы Для Perl, но медведей повторяются здесь: контейнеры не предоставляют Процесс родительского инициатора По умолчанию, что означает, что при запуске нового контейнера любой Выходная точка или CMD Набор в изображении Контейнер будет загружаться от, обычно станет родительским процессом в этом контейнере. Это важно отметить здесь для Perl (а также для других языков), поскольку они имеют тенденцию возвращаться к своему исходному процессу инициативы для обработки сигналов, поэтому без этого он может быть не отвечает:
docker run perl:5.32 perl -E 'sleep 300' ^C [refuses to die, even if sent SIGINT like above]
Это особенно важно для Kubernetes, как и его Контейнер POD Lifecycle Может использовать сигналы для зонда для проживания или готовности контейнеров, а бегущий POD/контейнер может казаться «зависать» на неопределенный срок, если эти сигналы не обрабатываются правильно.
Для Perl нужно установить % SIG
обработчик Если они хотят/нужно запустить Perl напрямую как PID 1:
docker run perl:5.32 perl -E '$SIG{TERM} = sub { $sig++; say "recv TERM" }; sleep 300; say "waking up" if $sig' ^C waking up recv TERM
Однако для большинства нормальных развертываний легче использовать инструмент, такой как Tini , Кататонит или Dumb-init Для контейнера Выходная точка
, рядом с вашим сценарием Perl/исполняемым в CMD
, Например Это маленькое Mojolicious Демо:
# docker build -t mojo-with-tini:dev . FROM perl:5.32-buster RUN apt-get update && \ apt-get install -y --no-install-recommends tini && \ cpanm Mojolicious ENTRYPOINT ["/usr/bin/tini", "--"] EXPOSE 3000 CMD ["/usr/local/bin/mojo", "daemon"]
Для Kubernetes можно также установить команда
и args
для стручка:
kubectl apply -f - <
Outro.
В очереди есть еще несколько советов, которые я бы написал здесь, но теперь этот пост становится довольно долго, поэтому, может быть, позже.
Я хотел бы услышать больше о том, как люди используют Docker-Perl, и особенно больше о том, как упростить разработка проектов Perl на контейнерных условиях.
Оригинал: «https://dev.to/zakame/a-few-tips-for-perl-on-docker-and-kubernetes-29bg»