在 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 ...
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 ...