Php 使用dockerfile在docker中安装mongodb驱动程序
我有一个mongodb docker容器。我需要另一个docker容器,它将安装php和apache。我想从这个容器中运行一个php脚本,并将一些数据发送到mongodb容器,以将数据保存在mongodb数据库中。所以我需要在php apache容器中安装mongodb驱动程序 为此,我创建了以下dockerfile: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
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文件)
一些解释:
&&
符号允许在单个dockerrun
命令中一个接一个地运行所有命令,从而形成单个中间容器,从而形成单个层
-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文件)
一些解释:
&&
符号允许在单个dockerrun
命令中一个接一个地运行所有命令,从而形成单个中间容器,从而形成单个层
-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()时