为何执行docker run时有时无法看到命令输出?
问题原因分析
这个现象的核心原因在于bash作为ENTRYPOINT时的启动特性,以及Docker传递命令参数的逻辑差异:
Docker参数传递逻辑
执行docker run myimage ps时,Docker会将ps作为CMD参数传递给ENTRYPOINT。官方Flyway镜像的ENTRYPOINT是专门的启动脚本,会直接把参数当作命令执行;但当你把ENTRYPOINT设为/usr/bin/bash时,实际执行的是/usr/bin/bash ps。bash的非交互式启动行为
bash在非交互式、无终端(未加-i/-t参数)的模式下启动时,不会把命令行参数当作要执行的命令,而是尝试将第一个参数(这里是ps)当作脚本文件加载。由于容器内不存在名为ps的脚本,bash会直接退出,且非交互式模式下错误输出被抑制,所以你看不到任何内容,同时bash正常退出返回状态码0。
而当你用echo ps | docker run -i -a stdin myimage时,-i让bash进入交互式模式,此时bash会从标准输入读取命令并执行,ps的输出因此被记录到容器日志中。官方镜像的正常逻辑
官方Flyway镜像的ENTRYPOINT脚本会正确解析并执行传入的CMD参数,因此能正常输出命令结果;你自定义镜像修改ENTRYPOINT为bash后,破坏了这种参数处理逻辑,导致命令无法被正确执行并输出。
内容的提问来源于stack exchange,提问作者Horrendo
相关产品推荐
相关产品推荐

