作为“podman build”或“docker build”的一部分运行时不显示下载进度

问题描述 投票:0回答:1

鉴于以下

Dockerfile
运行
sbt update
命令作为图像构建的一部分:

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

使用

podman build --no-cache .
构建映像时,
sbt
命令不会提供与在 Dockerfile 外部运行时一样多的输出。

这是图像构建的一部分的输出:

...
STEP 6/7: RUN git clone https://github.com/leanovate/play-mockws.git
Cloning into 'play-mockws'...
--> 1ae889e2fe5b
STEP 7/7: RUN cd play-mockws && sbt update
[info] welcome to sbt 1.9.7 (Eclipse Adoptium Java 11.0.21)
[info] loading settings for project play-mockws-build from plugins.sbt ...
[info] loading project definition from /build/play-mockws/project
[info] loading settings for project play-mockws from build.sbt ...

<HERE-MISSING-LOT-OF-OUTPUT>

[info] set current project to play-mockws (in build file:/build/play-mockws/)
[success] Total time: 14 s, completed Nov 23, 2023, 4:12:50 PM
COMMIT
--> fc9820272ac3

在构建上下文/场景之外执行相同的命令会提供大量输出(就像 sbt 下载的所有内容一样)。

例如,注释上面 Dockerfile 的最后一行(

sbt update
命令):

- RUN cd play-mockws && sbt update
+ # RUN cd play-mockws && sbt update

再次构建图像,然后执行它:

podman build . -t testsbt

podman run -it testsbt bash

> cd play-mockws
> sbt update

这会给出如下输出:

[info] welcome to sbt 1.9.7 (Eclipse Adoptium Java 11.0.21)
[info] loading settings for project play-mockws-build from plugins.sbt ...
[info] loading project definition from /build/play-mockws/project
https://repo1.maven.org/maven2/com/github/sbt/sbt-github-actions_2.12_1.0/0.19.0/sbt-github-actions_2.12_1.0-0.19.0.pom
  100.0% [##########] 3.0 KiB (4.5 KiB / s)
https://repo1.maven.org/maven2/org/scalameta/sbt-scalafmt_2.12_1.0/2.5.2/sbt-scalafmt_2.12_1.0-2.5.2.pom
  100.0% [##########] 2.9 KiB (4.4 KiB / s)
https://repo1.maven.org/maven2/org/scoverage/sbt-coveralls_2.12_1.0/1.3.11/sbt-coveralls_2.12_1.0-1.3.11.pom
  100.0% [##########] 3.8 KiB (5.7 KiB / s)
https://repo1.maven.org/maven2/org/scoverage/sbt-scoverage_2.12_1.0/1.8.2/sbt-scoverage-1.8.2.pom
  100.0% [##########] 2.3 KiB (47.4 KiB / s)
...

我希望在运行

sbt update
作为
podman build
的一部分时得到相同的输出。


需要注意的是,Docker 也会发生同样的情况,这并不是 podman 特有的。这可能与 sbt 检测到终端或未检测到终端时如何打印内容有关。

那么问题是:在运行

sbt
命令作为
podman build
.

的一部分时如何获得完整的详细输出
docker dockerfile sbt podman coursier
1个回答
1
投票

请注意,只需使用

sbt update | cat
(而不是简单的
sbt update
)即可在 Docker 或 podman 之外重现该问题。添加管道会切断 sbt 与终端的连接,导致它不再显示交互式进度表。 (然后缺少进度表会导致根本没有输出。)

我不确定所有可能的解决方案或解决方法,但这是一种解决方法。如果您使用

-debug
运行 sbt,您将看到如下输出:

[debug] downloaded https://repo1.maven.org/maven2/org/scalameta/munit_3/1.0.0-M10/munit_3-1.0.0-M10.jar
[debug] downloaded https://repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar

所以问题在某种意义上解决了,除了您还会得到许多您不想要的其他调试级别输出。您可以运行

sbt -debug update
,然后切换回信息级别日志记录,这将部分解决问题 - 在“下载”行之前您仍然会得到一堆额外的输出。

无论如何,正如我所说,也许存在更好的解决方案。如果您想自己调查问题,请注意,实际下载并显示进度表的是 Coursier 库。 (我原以为用

COURSIER_PROGRESS=true
运行 sbt 可能会成功,但似乎没有帮助。)

© www.soinside.com 2019 - 2024. All rights reserved.