我有一个 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 至少存在三个问题。
第一个与您的问题没有直接关系,但是您创建了太多层(每个层一个)RUN
命令),就像向映像添加驱动程序一样简单。您应该将所有这些放在一个层中(即单个RUN
命令)并在最后自行清理以保持图层占用空间较小。
现在是你真正问题的核心。正如您在输出中看到的,apt-get
以交互模式启动并要求确认。 docker 构建过程无法处理该问题,因此会中止该命令,从而导致构建失败。为了克服这个问题,apt-get
has a -y
默认情况下对所有提示回答“是”的选项。
最后一个位于添加 mongo 驱动程序的行中php.ini
:您正在使用单个 gt 将 echo 输出重定向到您的文件;符号 (>
),因此您将替换刚刚复制的文件的全部内容。您必须使用双gt;符号 (>>
) 用于要附加的内容。
以下 Dockerfile 应该可以解决上述问题(在没有您自己的 php.ini 文件的源 + cp 副本的情况下进行测试,因为我没有它们)
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
一些解释:
- The
&&
表示法允许在单个 docker 中一个接一个地运行所有命令RUN
命令产生一个中间容器,因此是一个层。
-
-y --no-install-recommends
选项apt-get
要求 apt 不进行交互(到处都回答“是”)并仅安装需要的软件包,而不是推荐的软件包。
- 最后两条指令
apt-get cleann && rm -rf /var/lib/apt/lists/*
删除通过运行 apt 生成的所有缓存,以便该层保持尽可能小。 (看apt-getDocker 最佳实践章节 https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#run)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)