golang:1.19.2-bullseye Docker容器构建输出中set -x未正确添加引号的原因咨询
golang:1.19.2-bullseye Docker容器构建输出中set -x未正确添加引号的原因咨询
这个问题其实和两个基础镜像使用的默认shell差异有关,咱们一步步拆解来看:
基础镜像的默认shell不同
golang:1.19.2-bullseye基于Debian Bullseye发行版,它的默认shell是bash;而你对比用的alpine:3.17.3默认使用的是ash——这是BusyBox自带的轻量级shell。不同shell的
set -x输出行为有区别
ash在开启set -x调试模式时,会自动给包含空格、特殊字符的变量值加上单引号,让你能直观看到参数的边界,就像你在alpine镜像的构建输出里看到的那样,所有带空格的参数都被引号包裹了。
而bash的set -x逻辑不一样,它不会主动给这类变量添加引号,只会直接输出变量展开后的内容。不过你不用担心,这只是输出格式的问题,shell在实际执行命令时是正确识别参数边界的——你看你的golang镜像例子里,最终编译出的main程序正确输出了-Wall -Wextra,说明环境变量的传递和解析都是正常的,只是bash的调试输出没有给你加上引号而已。
如果你想在golang镜像的构建过程中也看到带引号的set -x输出,可以手动指定用ash来执行RUN命令,比如修改Dockerfile里的RUN行:
RUN set -x && ash -c 'printf '\''package main\nimport (\n\t"fmt"\n\t"os"\n)\nfunc main(){\n\tfmt.Println(os.Getenv("CGO_CFLAGS"))\n}\n'\'' > main.go && cat main.go && CGO_ENABLED="${CGO_ENABLED}" CGO_CFLAGS="${CGO_CFLAGS}" go build main.go && ls && CGO_CFLAGS="${CGO_CFLAGS}" ./main'
这样就能得到和alpine镜像类似的带引号的调试输出了。
备注:内容来源于stack exchange,提问作者Shane Bishop
相关产品推荐
相关产品推荐

