在 Docker 中验证环境变量

Validate environment variables in Docker

Docker中有任何类型的 ASSERT 吗?

在这种特定情况下,我希望能够验证是否已设置环境变量,如果未设置则强制构建失败。

导致我出现问题的代码是:

echo ${LICENSE_KEY} > /etc/license.key

我的任务是让前一名员工的代码正常工作,但发现该文件是空的。令我震惊的是,这个未设置的变量对于这个构建脚本来说应该是致命的,并且可以节省我很多调试时间。

根据我对 Docker 文档的阅读(自 Docker 0.7 起)我可以 运行 一个 shell 命令 returns 一个非零状态和那会导致构建失败。例如

RUN [ ! -z "${LICENSE_KEY}" ]

虽然这会导致图像中出现额外的层和代码,但对于其他人来说可能并不明显,它只是为了 debugging/protection 而没有明确说明与其他命令结合使用时失败的原因.我真的很期待 docker 有类似的东西:

ASSERT ${LICENSE_KEY} != ""

这是我用过的解决方案,但不创建任何层的 ASSERT 会更好。

ARG LICENSE_KEY
RUN [ ! -z "${LICENSE_KEY}" ] # Assert LICENSE_KEY is defined

通过案例

Step 2/10 : ARG LICENSE_KEY
 ---> Using cache
 ---> e5fba6cf457c
Step 3/10 : RUN [ ! -z "${LICENSE_KEY}" ] # Assert LICENSE_KEY is defined
 ---> Running in 7e83e02e7372
 Removing intermediate container 7e83e02e7372
 ---> c31d8da7b006

失败案例

Step 2/10 : ARG LICENSE_KEY
 ---> Using cache
 ---> e5fba6cf457c
Step 3/10 : RUN [ ! -z "${LICENSE_KEY}" ] # Assert LICENSE_KEY is defined
 ---> Running in 0d10210c8bca
The command '/bin/sh -c [ ! -z "${LICENSE_KEY}" ] # Assert LICENSE_KEY is defined' returned a non-zero code: 1

它肯定会创建额外的 0 字节层。从运行可以看出:

docker history --no-trunc <image>

sha256:fe9<...snip...>   About an hour ago   |1 LICENSE_KEY=some-key /bin/sh -c [ ! -z "${LICENSE_KEY}" ] # Assert LICENSE_KEY is defined    0B
sha256:e5f<...snip...>   About an hour ago   /bin/sh -c #(nop)  ARG LICENSE_KEY                                                              0B                                                                                                                                                
sha256:5e8<...snip...>   4 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]                                                            0B

我遇到了类似的问题,我做了类似的事情:

RUN [ ! -z "${LICENSE_KEY}" ] || { echo "License key cannot be empty"; exit 1; } && \
    ... other run commands ...