如何在Dockerfile中检查构建参数是否以特定字符开头
解决Dockerfile中构建参数前缀匹配问题
问题原因
你原来的判断逻辑[ "$XDEBUG_VERSION" = "3*" ]使用的是[(test命令)的精确字符串匹配,这里的3*会被当作字面量字符串,而非通配符,因此只有当XDEBUG_VERSION的值恰好是3*时才会匹配,自然无法检测以3开头的版本。
可行解决方案
方案1:使用bash的[[进行模式匹配
[[是bash的扩展测试命令,支持通配符模式匹配,直接用==加前缀模式即可:
ARG XDEBUG_VERSION=3.1.2 RUN if [ "$XDEBUG_VERSION" = "3.1.2" ]; then echo "yes, it is 3.1.2"; fi RUN if [[ "$XDEBUG_VERSION" == 3* ]]; then echo "yes, starts with 3"; fi
方案2:使用case语句(兼容更多shell)
如果需要兼容非bash的shell,case语句是更通用的选择:
ARG XDEBUG_VERSION=3.1.2 RUN if [ "$XDEBUG_VERSION" = "3.1.2" ]; then echo "yes, it is 3.1.2"; fi RUN case "$XDEBUG_VERSION" in 3*) echo "yes, starts with 3";; esac
方案3:使用字符串截取判断
通过截取版本号的第一个字符,直接判断是否为3:
ARG XDEBUG_VERSION=3.1.2 RUN if [ "$XDEBUG_VERSION" = "3.1.2" ]; then echo "yes, it is 3.1.2"; fi RUN if [ "${XDEBUG_VERSION:0:1}" = "3" ]; then echo "yes, starts with 3"; fi
验证效果
使用上述任意方案后,构建时会输出预期结果:
Step 20/22 : RUN if [ "$XDEBUG_VERSION" = "3.1.2" ]; then echo "yes, it is 3.1.2"; fi ---> Running in e1499d0ec491 yes, it is 3.1.2 Removing intermediate container e1499d0ec491 ---> ad2439fcec2e Step 21/22 : RUN if [[ "$XDEBUG_VERSION" == 3* ]]; then echo "yes, starts with 3"; fi ---> Running in b8da583b4522 yes, starts with 3 Removing intermediate container b8da583b4522 ---> a9dbc5535002
内容的提问来源于stack exchange,提问作者Starx
相关产品推荐
相关产品推荐

