gpt4 book ai didi

php - 使用 dockerfile 在 docker 中安装 mongodb 驱动程序

转载 作者:行者123 更新时间:2023-12-02 21:04:55 24 4
gpt4 key购买 nike

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

最佳答案

What went wrong here? Is there anything wrong in the dockerfile ?

在我看来,您的 Dockerfile 至少存在三处错误。

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

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

最后一个是在您将 mongo 驱动程序添加到 php.ini 的行中:您正在使用单个 gt; 将 echo 输出重定向到您的文件; sign (>),因此您将替换刚刚复制的文件的全部内容。您必须使用双 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 options to apt-get 要求 apt 不进行交互(到处回答是)并且只安装需要的包,而不是推荐的。
  • 最后两条指令 apt-get cleann && rm -rf/var/lib/apt/lists/* 删除运行 apt 时产生的所有缓存,使层保持尽可能小。 (参见 apt-get chapter in docker best practice)

关于php - 使用 dockerfile 在 docker 中安装 mongodb 驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58680158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com