使用 dockerfile 在 docker 中安装 mongodb 驱动

2024-05-11

我有一个 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 有什么问题吗?


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

在我看来,您的 Dockerfile 至少存在三个问题。

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

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

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

以下 Dockerfile 应该可以解决上述问题(在没有您自己的 php.ini 文件的源 + cp 副本的情况下进行测试,因为我没有它们)

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

一些解释:

  • The &&表示法允许在单个 docker 中一个接一个地运行所有命令RUN命令产生一个中间容器,因此是一个层。
  • -y --no-install-recommends选项apt-get要求 apt 不进行交互(到处都回答“是”)并仅安装需要的软件包,而不是推荐的软件包。
  • 最后两条指令apt-get cleann && rm -rf /var/lib/apt/lists/*删除通过运行 apt 生成的所有缓存,以便该层保持尽可能小。 (看apt-getDocker 最佳实践章节 https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#run)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 dockerfile 在 docker 中安装 mongodb 驱动 的相关文章