Что здесь пошло не так? Что-то не так в dockerfile?
В вашем Dockerfile IMO есть как минимум три проблемы.
Первая не имеет прямого отношения к вашей проблеме, но высоздать слишком много слоев (по одному для каждой команды RUN
) для чего-то простого, например, добавить драйвер к вашему изображению. Вы должны поместить все это в один слой (т. Е. Одну команду RUN
) и очистить после себя в конце, чтобы сохранить небольшой размер слоя.
Теперь суть вашей реальной проблемы. Как видно из вывода, apt-get
запускается в интерактивном режиме и запрашивает подтверждение. Процесс сборки Docker не может обработать это и поэтому прерывает команду, вызывая сбой сборки. Чтобы преодолеть это, apt-get
имеет опцию -y
, чтобы ответить «да» на все запросы по умолчанию.
Последний находится в строке, где вы добавляете драйвер монго в php.ini
: выперенаправить вывод эха в ваш файл одним gt;знак (>
), следовательно, вы заменяете все содержимое только что скопированного файла. Вы должны использовать двойной GT;подписать (>>
) добавляемый контент.
Следующий Dockerfile должен решить указанные выше проблемы (проверено без копии исходных кодов + cp вашего собственного файла php.ini, поскольку у меня их нет)
FROM php:7.3-apache
COPY src/ /var/www/html
RUN apt-get update \
&& apt-get install -y --no-install-recommends openssl libssl-dev libcurl4-openssl-dev \
&& pecl install mongodb \
&& cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini \
&& echo "extension=mongodb.so" >> /usr/local/etc/php/php.ini \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
EXPOSE 80
Некоторое объяснение:
- Обозначение
&&
позволяет выполнять все команды одну за другой в одной команде docker RUN
, в результате чего получается один промежуточный контейнер,таким образом, один слой. -y --no-install-recommends
опции для apt-get
попросить не переходить в интерактивный режим (ответьте да везде) и устанавливать только необходимые пакеты, а не рекомендуемые. - ДваПоследняя инструкция
apt-get cleann && rm -rf /var/lib/apt/lists/*
удалить все кэши, выполнив apt, чтобы слой оставался как можно меньше.