Это хорошее начало.Позвольте мне рассмотреть ваши проблемы один за другим, и затем я дам несколько советов.
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
выше будет хорошей практикой и будет работать с тем, что у вас есть сейчас.