Docker中有任何类型的ASSERT吗?
在这种特定情况下,我希望能够验证是否已设置环境变量,如果没有设置则强制构建失败。
导致我出现问题的代码是:
echo ${LICENSE_KEY} > /etc/license.key
我的任务是使上一位员工的代码正常工作,并且发现该文件为空。令我惊讶的是,未设置此变量对于此构建脚本应该是致命的,并且可以为我节省大量调试时间。
从对Docker文档的阅读(自Docker 0.7起)开始,我可以运行一个shell命令,该命令返回非零状态,这将导致构建失败。例如
RUN [ ! -z "${LICENSE_KEY}" ]
尽管这会导致映像中出现额外的层和代码,但对于其他人来说可能并不明显,因为它仅用于调试/保护,并且在与其他命令结合使用时未明确说明失败的原因。我真的很期待docker有类似的东西:
ASSERT ${LICENSE_KEY} != ""
答案 0 :(得分:2)
这是我使用的解决方案,但是不创建任何图层的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
答案 1 :(得分:1)
我有类似的问题,我做了类似的事情:
RUN [ ! -z "${LICENSE_KEY}" ] || { echo "License key cannot be empty"; exit 1; } && \
... other run commands ...