首页 > 解决方案 > 使用 dockerfile 在 docker 中安装 mongodb 驱动程序

问题描述

我有一个 mongodb docker 容器。我需要另一个安装 php 和 apache 的 docker 容器。我想从这个容器运行一个 php 脚本并将一些数据发送到 mongodb 容器以将数据保存在 mongodb 数据库中。所以我需要在 php-apache 容器中安装 mongodb 驱动程序。

为此,我创建了以下 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 docker 镜像。然后它应该安装 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

这里出了什么问题?dockerfile 有什么问题吗?

标签: phpmongodbapachedockerdockerfile

解决方案


这里出了什么问题?dockerfile 有什么问题吗?

您的 Dockerfile IMO 至少存在三处问题。

第一个与您的问题没有直接关系,但是您正在创建太多层(每个RUN命令一个),例如将驱动程序添加到图像中这样简单的事情。您应该将所有这些放在一个层中(即单个RUN命令)并在最后自己清理以保持层占用空间小。

现在是你真正问题的核心。正如您在输出中看到的那样,apt-get它以交互模式启动并要求确认。docker build 进程无法处理该问题,因此会中止导致构建失败的命令。为了克服这个问题,默认情况下apt-get可以-y选择对所有提示回答“是”。

最后一个是在您将 mongo 驱动程序添加到的行中php.ini:您正在使用单个 gt 将 echo 输出重定向到您的文件;符号 ( >),因此您将替换刚刚复制的文件的全部内容。您必须使用双 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

一些解释:

  • &&符号允许在单个 dockerRUN命令中一个接一个地运行所有命令,从而产生单个中间容器,从而形成单个层。
  • -y --no-install-recommendsapt-get要求不进行交互的选项(到处回答是)并仅安装需要的软件包,而不是推荐的软件包。
  • 最后两条指令apt-get cleann && rm -rf /var/lib/apt/lists/*删除通过运行 apt 生成的所有缓存,以使层保持尽可能小。(参见apt-getdocker 最佳实践章节

推荐阅读