我正在将 Ubuntu 14.04 下在 Apache 中运行的旧版 PHP 应用程序迁移到 Docker 以进行进一步开发。
因此,我需要 PHP 引擎安装与 Ubuntu 安装相同的模块,并且我想在我的 Dockerfile 中自动验证 php -m
的输出包含与 Ubuntu 安装相同的模块。在 Ubuntu 计算机上缓存 php -m
的输出。
在 shell 脚本中,我希望使用退出代码和 set -e
可以做到这一点。 Dockerfile 文档没有提及任何有关 RUN 命令的退出代码的内容,因此它可能不可行。
因此,问题通常是“如何使代码中的 Dockerfile 构建失败”,但我专门针对我的用例询问了它,因为可能有更智能的方法来做到这一点。
建议?
最佳答案
虽然可能没有记录,但 RUN
命令很容易出错,因此脚本的退出代码将使构建失败。
解决您的用例的一个非常简单的方法是拥有两个文件并比较
它们。
这是执行此操作的骨架:
FROM alpine
RUN echo 'a' > a; echo 'a' > b \
&& diff a b
# all is right, this won't fail
RUN echo 'a' > a; echo 'b' > b \
&& diff a b
# woops?!
将构建:
$ docker build .
[+] Building 1.5s (6/6) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 200B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/alpine:latest 0.6s
=> CACHED [1/3] FROM docker.io/library/alpine@sha256:a75afd8b57e7f34e4dad8d65e2c7ba2e1975c795ce1ee22fa34f8cf4 0.0s
=> [2/3] RUN echo 'a' > a; echo 'a' > b && diff a b 0.4s
=> ERROR [3/3] RUN echo 'a' > a; echo 'b' > b && diff a b 0.4s
------
> [3/3] RUN echo 'a' > a; echo 'b' > b && diff a b:
#6 0.352 --- a
#6 0.352 +++ b
#6 0.352 @@ -1 +1 @@
#6 0.352 -a
#6 0.352 +b
------
executor failed running [/bin/sh -c echo 'a' > a; echo 'b' > b && diff a b]: exit code: 1
因此,在您的实际用例中,您可以做的是:
FROM alpine
COPY php-modules.txt .
RUN php -m | diff php-modules.txt -
这绝对是有目的的行为:
关于php - 如何在我的 Dockerfile 中验证 PHP 是否包含我的镜像中所需的模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66304856/