2

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

4

2 回答 2

5

这里出了什么问题?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 最佳实践章节
于 2019-11-03T12:54:07.957 回答
-2

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

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

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

于 2019-11-03T13:04:01.637 回答