【问题标题】:Install mongodb driver in docker with dockerfile使用 dockerfile 在 docker 中安装 mongodb 驱动程序
【发布时间】:2019-11-03 12:29:36
【问题描述】:

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

【问题讨论】:

    标签: php mongodb apache docker dockerfile


    【解决方案1】:

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

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

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

    现在是您真正问题的核心。正如您在输出中看到的,apt-get 以交互模式启动并要求确认。 docker build 进程无法处理该问题,因此会中止导致构建失败的命令。为了克服这个问题,apt-get 有一个 -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
    

    一些解释:

    • && 表示法允许在单个 docker RUN 命令中一个接一个地运行所有命令,从而生成单个中间容器,即单个层。
    • -y --no-install-recommendsapt-get 的选项要求不要进行交互(到处回答是)并只安装需要的软件包,而不是推荐的软件包。
    • 最后两条指令apt-get cleann && rm -rf /var/lib/apt/lists/* 删除通过运行 apt 生成的所有缓存,以使层保持尽可能小。 (见apt-get chapter in docker best practice

    【讨论】:

    • 感谢您的回复。我发现了另一个问题。当我在浏览器上检查 phpinfo() 时。它没有显示加载了mongodb。此外,usr/local/etc/php/php.ini-production 不会复制到 /usr/local/etc/php/php.ini。 php.ini 文件只有一行 - extension=mongodb.so。是否有进一步改进 dockerfile 的空间?我的工作很简单。我只需要从这个容器运行一个 php 脚本并将数据发送到 mongodb 容器。
    • 虽然这实际上是另一个问题,应该在一个新问题中提出,但它非常微不足道,所以我在这里回答了。查看我的编辑。
    • 非常感谢,但是 phpinfo() 页面中仍然没有显示 mongodb
    • 它显示在我的实例上,该实例从上面的 Dockerfile 构建的映像运行。 Mongodb 扩展版本 1.6.0
    • 拥有不止一层不一定是坏事。更多的层可以导致更快的图像重建。
    【解决方案2】:

    把它放在你的 Docker 文件的开头,在安装所有其他扩展之前有它很重要,否则它会失败。

    FROM php:7.3-apache
    RUN apt-get update -y && apt-get upgrade \
        && pecl install mongodb && docker-php-ext-enable mongodb
    

    这就是我运行 mongodb 所需的全部内容FROMphp:7.3-cli-buster 可能它也适用于其他版本 - fpm、apache 等。

    【讨论】:

    • 我在 dockerfile 的开头尝试了你的 2 行,但它显示错误 - Sending build context to Docker daemon 8.704kB Error response from daemon: No build stage in current context
    • @A.Chy 查看已编辑的 Dockerfile - 它对我来说效果很好,也许由于不同的 FROM 而您有问题 - 请尝试使用 7.3-apache-buster。这是full list of supported tags
    • @A.Chy 尝试只构建这三行的 docker 文件,一旦工作,添加目标 Docker 文件其余部分的行,看看是什么导致了错误。
    • 我试过了,但它显示了老问题。 php.ini 文件未显示在 /usr/local/etc/php 文件夹中
    • @A.Chy 添加行RUN echo "extension=mongodb.so" >> /usr/local/etc/php/php.ini
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多