docker中的wget会打印数千行来显示进度,而不是单行进度条

idfiyjo8  于 2022-11-03  发布在  Docker
关注(0)|答案(2)|浏览(300)

当我wget一个文件时,例如从GitHub,它会显示一个漂亮的单行进度条,如下所示:

wget -N http://db.sqlite.zip
db.sqlite.zip   28%[====>                       ]  68.79M   370KB/s    eta 5m 53s

但是如果我在启动一个容器时以相同的方式运行wget命令,作为一个bash脚本来获取一些数据,它会打印数千行,显然是针对每下载50K位:

app_1  |      0K .......... .......... .......... ..........  0%  212K 19m12s
app_1  |     50K .......... .......... .......... ..........  0%  426K 14m22s
app_1  |    100K .......... .......... .......... ..........  0% 38.4M 9m37s
app_1  |    150K .......... .......... .......... ..........  0%  430K 9m35s
app_1  |    200K .......... .......... .......... ..........  0% 33.9M 7m41s
...
  • 很多...更多这样的行(它实际上填充了stdout缓冲区,我不想这样做)。
    我怎么能在我的主机上得到同样的行为,例如显示一行进度条?当然,如果可能的话。否则,我只是简单地-q它,这就结束了。
3qpi33ja

3qpi33ja1#

在构建期间,Docker不分配tty。这将使wget回退到dot进度条的显示方法。
遗憾的是,对于您的问题没有直接的解决方案。以下是一些建议:

  • 强制bar方法:
wget \
  --no-verbose --show-progress \
  --progress=bar:force:noscroll \
  url
  • 注意 *:这很可能仍会产生相当多的输出行。
  • 减少dot方法打印行的频率:
wget \
  --no-verbose --show-progress \
  --progress=dot:mega \
  url
  • 编写一些自定义脚本,将wget的输出转换为您想要的输出。
y1aodyip

y1aodyip2#

这个命令需要下载指定的新容器映像。你已经注意到很多“层”被下载了。这是因为你的容器映像是建立在另一个之上的,所以你也需要下载那个映像,并且可能那个映像是建立在另一个之上的,这就是为什么你会被显示所有下载行的原因。这就是docker架构的工作原理。

回到你最初的问题,你不能命令wget按顺序获取docker的下载。但是你可以用管道命令只获取控制台输出的第一行。当然其他的仍然存在,但是你不会看到它们。

wget image_name | head -n 1

相关问题