php - 使用 dockerfile 在 docker 中安装 mongodb 驱动程序
问题描述
我有一个 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 有什么问题吗?
解决方案
这里出了什么问题?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-recommends
apt-get
要求不进行交互的选项(到处回答是)并仅安装需要的软件包,而不是推荐的软件包。- 最后两条指令
apt-get cleann && rm -rf /var/lib/apt/lists/*
删除通过运行 apt 生成的所有缓存,以使层保持尽可能小。(参见apt-get
docker 最佳实践章节)
推荐阅读
- python - PySpark:对多个数据帧进行分区和散列,然后加入
- docker - Nginx + 码头工人。504网关超时
- windows - 为什么powershell不保存文件
- sql - 在 MSSQL 中查找“LIKE”重复项
- javascript - 复选框使用 jquery 过滤产品并通过重新加载保持状态
- scala - 从 Cassandra 查询的数据无法在同一列上再次过滤(InvalidQueryException)
- php - 在哪里以及如何实例化依赖项
- ajax - ASP.NET MVC - 对pdf文件的服务器端的ajax调用?
- c++ - std::lists 的 std::vector 中的不可复制元素
- xpath - 难以找到正确的 xpath