鉴于以下
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
. 的一部分时如何获得完整的详细输出
请注意,只需使用
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 可能会成功,但似乎没有帮助。)