Установите драйвер mongodb в Docker с помощью Dockerfile - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть докерский контейнер mongodb. Мне нужен еще один докер-контейнер, на котором будут установлены php и apache. Я хочу запустить php-скрипт из этого контейнера и отправить некоторые данные в контейнер mongodb для сохранения данных в базе данных mongodb. Поэтому мне нужно установить драйвер mongodb в контейнер php-apache.

Для этого я создал следующий dockerfile:

FROM php:7.3-apache
COPY src/ /var/www/html
RUN apt-get update
RUN apt-get install openssl libssl-dev libcurl4-openssl-dev
RUN pecl install mongodb
RUN cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini
RUN echo "extension=mongodb.so" > /usr/local/etc/php/php.ini
EXPOSE 80

Сначала создается образ докера php-apache. Затем он должен установить драйвер mongodb.

Но когда я запускаю следующую команду

docker build -t my-mongo .

В какой-то момент он показывает следующее сообщение и останавливает выполнение:

Need to get 2213 kB of archives.
After this operation, 9593 kB of additional disk space will be used.
Do you want to continue? [Y/n] Abort.
The command '/bin/sh -c apt-get install openssl libssl-dev libcurl4-openssl-dev' returned a non-zero code: 1

Что здесь пошло не так? Что-то не так в файле Docker?

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

Что здесь пошло не так? Что-то не так в 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, чтобы слой оставался как можно меньше.
0 голосов
/ 03 ноября 2019

поместите это в начало вашего файла Docker, важно иметь его перед установкой всех других расширений, в противном случае это не получится.

FROM php:7.3-cli-buster
RUN apt-get update -y && apt-get upgrade -y;
RUN pecl install mongodb && docker-php-ext-enable mongodb

Это все, что мне нужно для запуска mongodb FROM php: 7.3-cli-buster Возможно, это будет работать и для других версий - fpm, apache и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...