Docker构建生成entrypoint.sh,run传环境变量报exec格式错误如何解决
问题排查与修复方案
核心报错原因
- 缺少脚本解释器声明:你生成的
/opt/entrypoint.sh没有首行的shebang声明,系统无法识别用什么解释器执行脚本,直接触发exec format error。这是你加了变量配置后刚好触发报错的直接诱因(之前脚本内容符合默认执行规则的场景可能不报错,但属于不规范写法)。 - 变量引用时机错误:你当前写法里的
${OV_PASSWORD}会在镜像构建阶段就被Docker解析替换,你构建镜像时没有传递这个环境变量的话,写入脚本的内容就会变成gvmd --user=admin --new-password=,根本拿不到docker run时传递的运行时环境变量。
修复后的Dockerfile配置
你需要给脚本加shebang声明,同时转义变量前的$符号,让变量原样写入脚本,等到容器运行时再解析:
FROM kalilinux/kali-rolling RUN echo '#!/bin/bash' > /opt/entrypoint.sh && \ echo "\n##### Provision openvas user #####\n" >> /opt/entrypoint.sh && \ echo "useradd -rm -d /home/openvas -s /bin/bash -g _gvm openvas" >> /opt/entrypoint.sh && \ echo "chown -R openvas:_gvm /home/openvas" >> /opt/entrypoint.sh && \ echo "gvmd --user=admin --new-password=\${OV_PASSWORD}" >> /opt/entrypoint.sh && \ chmod +x /opt/entrypoint.sh ENTRYPOINT ["/opt/entrypoint.sh"] CMD ["tail", "-f","/dev/null"]
补充说明
你当前的docker run命令末尾加了/bin/bash,这个参数只会覆盖Dockerfile里的CMD指令,不会跳过ENTRYPOINT执行,容器启动后还是会先跑entrypoint.sh的所有逻辑,再进入bash。如果你需要直接进入容器shell不执行ENTRYPOINT,可以启动时加参数--entrypoint=/bin/bash。
内容的提问来源于stack exchange,提问作者LewlSauce
相关产品推荐
相关产品推荐

