Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用dockerfile在docker中安装mongodb驱动程序_Php_Mongodb_Apache_Docker_Dockerfile - Fatal编程技术网

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

Php 使用dockerfile在docker中安装mongodb驱动程序,php,mongodb,apache,docker,dockerfile,Php,Mongodb,Apache,Docker,Dockerfile,我有一个mongodb docker容器。我需要另一个docker容器,它将安装php和apache。我想从这个容器中运行一个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 openss

我有一个mongodb docker容器。我需要另一个docker容器,它将安装php和apache。我想从这个容器中运行一个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 IMO至少有三个问题

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

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

最后一行是将mongo驱动程序添加到
php.ini
:使用一个gt将echo输出重定向到文件;签名(
),因此您正在替换刚才复制的文件的完整内容。您必须使用双gt;为要附加的内容签名(
>

下面的Dockerfile应该修复上述问题(由于我没有源代码+cp的拷贝,所以测试时没有您自己的php.ini文件)

一些解释:

  • &&
    符号允许在单个docker
    run
    命令中一个接一个地运行所有命令,从而形成单个中间容器,从而形成单个层
  • -y--no install建议
    选择
    apt get
    要求apt不要进行交互(在任何地方都回答yes),只安装所需的软件包,而不是推荐的软件包
  • 最后两条指令
    apt get cleann&&rm-rf/var/lib/apt/lists/*
    删除运行apt生成的所有缓存,以便层尽可能小
这里出了什么问题?dockerfile有什么问题吗

你的Dockerfile IMO至少有三个问题

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

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

最后一行是将mongo驱动程序添加到
php.ini
:使用一个gt将echo输出重定向到文件;签名(
),因此您正在替换刚才复制的文件的完整内容。您必须使用双gt;为要附加的内容签名(
>

下面的Dockerfile应该修复上述问题(由于我没有源代码+cp的拷贝,所以测试时没有您自己的php.ini文件)

一些解释:

  • &&
    符号允许在单个docker
    run
    命令中一个接一个地运行所有命令,从而形成单个中间容器,从而形成单个层
  • -y--no install建议
    选择
    apt get
    要求apt不要进行交互(在任何地方都回答yes),只安装所需的软件包,而不是推荐的软件包
  • 最后两条指令
    apt get cleann&&rm-rf/var/lib/apt/lists/*
    删除运行apt生成的所有缓存,以便层尽可能小

将其放在Docker文件的开头,在安装所有其他扩展名之前安装它非常重要,否则它将失败

FROM php:7.3-cli-buster
RUN apt-get update -y && apt-get upgrade -y;
RUN pecl install mongodb && docker-php-ext-enable mongodb

这就是让mongodb从
运行所需的全部内容,可能它也适用于其他版本—fpm、apache等。

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

FROM php:7.3-cli-buster
RUN apt-get update -y && apt-get upgrade -y;
RUN pecl install mongodb && docker-php-ext-enable mongodb

这就是让mongodb从
运行所需的一切,它可能也适用于其他版本—fpm、apache等。

感谢您的回复。我发现了另一个问题。当我在浏览器上选中phpinfo()时。它没有显示mongodb已加载。此外,usr/local/etc/php/php.ini-production没有复制到/usr/local/etc/php/php.ini。ini文件只有一行-扩展名=mongodb.so。dockerfile还有改进的余地吗?我的工作很简单。我只需要从这个容器中运行一个php脚本并将数据发送到mongodb容器。虽然这实际上是另一个问题,应该在一个新问题中提出,但它非常简单,所以我在这里回答。请参阅我的编辑。非常感谢,但在phpinfo()页面中仍然没有显示mongodb。它显示在从上面Dockerfile构建的映像运行的我的实例上。Mongodb扩展版本1.6.0感谢您的回复。我发现了另一个问题。当我在bro上检查phpinfo()时