Кто должен знать, если официальный образ докера основан на X - PullRequest
0 голосов
/ 14 декабря 2018

Я хочу развернуть контейнер PHP с использованием официального образа .

После этого мне нужно установить imagick, поэтому мне нужно установить libmagickwand-dev также с использованием apt-get first.

AFAIK, PHP изображение может быть основано на другом изображении, и мне нужно, чтобы оно было, например, на основе Ubuntu, чтобы иметь возможность использовать apt-get.

Если мойна хосте есть apt-get, я знаю, что он будет доступен, но если я запусту этот образ на Docker для MacOS у меня его может не быть.

Как я могу узнать, если иОфициальный образ основан на другом, который мне нужен, например, этот случай?

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

Мой dockerfile выглядит так:

# Backend Image - https://hub.docker.com/_/php/
FROM php:7.2-apache

# Imagick
RUN apt-get update && apt-get install -y libmagickwand-dev
RUN pecl install imagick-3.4.3 \
    && docker-php-ext-enable imagick

1 Ответ

0 голосов
/ 14 декабря 2018

Это хорошее начало.Позвольте мне рассмотреть ваши проблемы один за другим, и затем я дам несколько советов.

AFAIK, образ PHP может быть основан на другом образе, и мне нужно, чтобы он был, например, на основе Ubuntu, чтобы бытьвозможность использовать apt-get.

Официальные образы PHP построены из множества базовых дистрибутивов (https://hub.docker.com/_/php/ перечисляет их).Отсюда я вижу, что 7.2-apache, вероятно, основан на растяжке Debian - отличный выбор, который обеспечит apt.Вы можете увидеть, как эти образы строятся из их файлов Docker, которые также связаны в этом разделе с github.

Если у моего хоста есть apt-get, я знаю, что он будет доступен, но если я запусту этот образ в Docker для MacOS, у меня его может не быть.

Просточтобы быть понятным, большое преимущество docker заключается в том, что не имеет значения в какой операционной системе работает хост, если у него есть докер.Компоненты, доступные в образе, определяются только тем изображением, на котором он был основан, и докер-файлом, который его построил - другими словами, если вы создадите свой докер-файл на основе какого-либо дистрибутива - например, debian-stretch - который включает в себя apt, то выиметь эту версию и все, что идет с ней, где бы вы ни создавали образ или не запускали его.OSX, Windows, Debian, Ubuntu, CoreOS, Centos - не имеет значения.Это большая причина, по которой докер огромен - обработка зависимостей, которые связывают кодовые базы с операционными системами, на самом деле довольно сложная задача, и докер полностью ее устраняет.

На самом деле, OSX не имеет необходимой поддержки ядра для собственного докера, и в любом случае не может запускать исполняемые файлы linux ELF, поэтому Docker для Mac использует виртуализацию osx для создания почти невидимого экземпляра linux иИсполняемый файл docker на стороне osx обеспечивает проксирование к слою linux.Но это происходит прозрачно для пользователя.

Как узнать, основано ли официальное изображение на другом, который мне нужен, например, в этом случае?

Посмотрев файл докера, связанный со страницей библиотеки dockerhub,В вашем случае это https://github.com/docker-library/php/blob/master/7.2/stretch/apache/Dockerfile, который показывает, что он основан на стретч-стройном /Debian stretch-slim отлично подходит для докера, потому что он легкий и не включает в себя кучу вещей, не относящихся к докерным контейнерам.

Итак, то, что вы делаете, выглядит хорошо, и вы начинаете довольно хорошо.

Я хотел бы упомянуть одну вещь, которую вы могли бы рассмотреть.Способ apt работает, он загружает множество метаданных пакета локально, когда вы apt-get update.Если вы не удалите его в той же команде RUN, которая его создает , эти индексные файлы будут находиться в слое, созданном этой командой RUN;даже если вы удалите их в последующем слое, пространство, которое они занимают, все равно будет частью изображения.

Поэтому, когда вы сделаете это:

RUN apt-get update && apt-get install -y libmagickwand-dev
RUN pecl install imagick-3.4.3 \
    && docker-php-ext-enable imagick

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

RUN apt-get update && apt-get install -y \
        $PHPIZE_DEPS \
        ca-certificates \
        curl \
        xz-utils \
    --no-install-recommends && rm -r /var/lib/apt/lists/*

&& rm -r /var/lib/apt/lists/* удаляет метаданные пакета один разон больше не нужен * в той же команде RUN, которая его создала *, поэтому во время выполнения он не поставляется с изображением.Вот почему вы должны снова apt-get update.Конечно, вы уже знаете, что вам все равно придется делать это для обновленного индекса хранилища пакетов.Короче говоря, добавление && rm ... в конце строки apt выше будет хорошей практикой и будет работать с тем, что у вас есть сейчас.

...