在podman/docker build中运行sbt update无下载进度输出的解决方法
解决Podman/Docker构建时sbt update无完整输出的问题
在使用podman build --no-cache .或Docker构建镜像时,执行sbt update命令无法看到完整的下载进度输出,但进入容器手动执行却能正常显示。这是因为sbt会检测当前是否为交互式终端(TTY),非TTY环境下会自动简化输出。
原Dockerfile
FROM eclipse-temurin:11-jre-jammy # Install git RUN apt-get update && \ apt-get install -y git && \ rm -rf /var/lib/apt/lists/* && \ git --version # Mandatory as sbt cannot run from /root anyway WORKDIR /build # Install sbt ARG SBT_VERSION=1.9.7 RUN \ curl -k -L -o sbt-$SBT_VERSION.deb https://repo.scala-sbt.org/scalasbt/debian/sbt-$SBT_VERSION.deb && \ dpkg -i sbt-$SBT_VERSION.deb && \ rm sbt-$SBT_VERSION.deb && \ apt-get update && \ apt-get install sbt && \ rm -rf /var/lib/apt/lists/* && \ sbt sbtVersion # Download some sbt project RUN git clone https://github.com/leanovate/play-mockws.git # Run a sbt command that should give plenty of output RUN cd play-mockws && sbt update
解决方案
方式一:通过sbt参数强制输出详细日志
sbt默认在非TTY环境下简化输出,可添加JVM参数强制开启完整日志:
修改Dockerfile最后一行:
RUN cd play-mockws && sbt -Dsbt.log.noformat=true update
若需要更详细的调试信息,可升级日志级别:
RUN cd play-mockws && sbt -Dlog.level=debug update
方式二:模拟TTY环境执行命令
让sbt认为处于交互式终端,从而输出完整下载进度:
Podman
在RUN指令后添加--tty选项:
RUN --tty cd play-mockws && sbt update
Docker
使用script命令创建伪终端:
RUN cd play-mockws && script -q -c "sbt update" /dev/null
方式三:设置TERM环境变量
在Dockerfile中添加环境变量,让sbt识别终端类型:
ENV TERM=xterm
之后执行sbt update,部分场景下可触发完整输出。
内容的提问来源于stack exchange,提问作者Gaël J
相关产品推荐
相关产品推荐

