Один из моих модульных тестов убивает работающий контейнер Docker. Чтобы модульный тест работал, мне нужно запустить контейнер с docker-compose run
, чтобы ему было что убивать.
Какой самый маленький и простой образ можно использовать с docker-compose.yml, чтобы это произошло?
Обратите внимание, что Dockerfile не требуется.
Вам просто нужен файл docker-compose для этого
version: '3.9'
services:
myservice:
image: alpine:latest
command: tail -f /dev/null
Вы, вероятно, можете найти другие образы для запуска, если предпочитаете что-то другое. nginx:alpine
приходит на ум. Для этого не нужна команда, поэтому вы должны сохранить строку в файле docker-compose.
Является ли Alpine самым маленьким изображением, которое можно использовать?
@EricHansen извлекает набор изображений-кандидатов и сравнивает их размеры. busybox
может быть меньше.
Нет, это не так. Это всего 5-6 МБ, так что это довольно мало. Если размер важен, вы можете заменить alpine:latest
на busybox:latest
, который весит всего 1,24 МБ. Вы, вероятно, можете получить что-то еще меньше, сделав изображение самостоятельно.
Если вы ищете буквально самое маленькое изображение, и ему буквально не нужно ничего делать, кроме как не выходить, k8s.gcr.io/pause
должно быть близко.
Этот образ является частью Kubernetes, и вы можете прочитать его источник. Makefile компилирует небольшую программу на C в статический двоичный файл, а затем встраивает его в образ FROM scratch
. Это означает, что он даже не тратит мегабайт на статический двоичный файл BusyBox, поэтому он не содержит ненужной чепухи, такой как оболочка, tail
, менеджер пакетов Alpine apk
или вообще что-либо еще.
~% docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
k8s.gcr.io/pause 3.7 221177c6082a 3 weeks ago 711kB
busybox latest 2fb6fc2d97e1 3 weeks ago 1.24MB
alpine latest 76c8fb57b6fc 4 days ago 5.57MB
Единственная вещь, которую делает этот образ, кроме сна навсегда, - это замечает, завершаются ли какие-либо дочерние процессы и ждать(2) для них. Поскольку ожидается, что это будет процесс с идентификатором 1, это очищает любые осиротевшие процессы, которые переназначаются процессу init (эвфемистически, «пожиная зомби»). Kubernetes использует его в качестве корня для модуля с несколькими контейнерами, где модули используют разные пространства имен; также см. Какую работу выполняет процесс в контейнере "gcr.io/google_containers/pause:0.8.0"? или Всемогущий контейнер с паузами Яна Льюиса (который включает весь исходный код C как часть сообщения в блоге).
Вероятно, вы могли бы создать еще меньший образ, если бы переписали двоичный файл на ассемблере, чтобы вам не понадобился стандартный шаблон для запуска и остановки процесса C, но, вероятно, это не стоит затраченных усилий.
Потрясающе, спасибо! Я думаю, что, возможно, единственной меньшей задачей будет создание нашего собственного «контейнера без выхода», но тогда нам также придется беспокоиться о конвейерах и модульных тестах для создания этого образа и его доступности!
Пожалуйста, прочтите раздел помощи, чтобы ознакомиться с сайтом. Это не форум. Не редактируйте вопросы, содержащие ответы. Вы уже приняли ответ, который считаете лучшим. Если вы чувствуете, что вам нужно дать свой собственный ответ, просто сделайте это... в качестве ответа.