如何查看docker镜像的日志?

hvvq6cgz  于 2023-03-29  发布在  Docker
关注(0)|答案(4)|浏览(268)

在docker的世界里,你可以很容易地看到docker容器的日志(也就是运行中的镜像)。但是在创建镜像的过程中,通常会发出多个命令。例如node项目中的npm install命令。同时看到这些命令的日志会很有帮助。我很快地搜索了文档,但是没有找到如何获得docker镜像的日志。这可能吗?

csbfibhn

csbfibhn1#

遇到同样的问题,我用

docker build --no-cache --progress=plain -t my-image .
8zzbczxx

8zzbczxx2#

更新:既然这个问题已经被问到了,似乎每个人都在看到buildkit的输出变化后发现了它。Buildkit包括以下选项(docker build --help可以看到所有选项):

--build-arg list          Set build-time variables
      --cache-from strings      Images to consider as cache sources
  -f, --file string             Name of the Dockerfile (Default is 'PATH/Dockerfile')
      --no-cache                Do not use cache when building the image
  -o, --output stringArray      Output destination (format: type=local,dest=path)
      --platform string         Set platform if server is multi-platform capable
      --progress string         Set type of progress output (auto, plain, tty). Use plain to show container output (default "auto")
      --pull                    Always attempt to pull a newer version of the image
  -q, --quiet                   Suppress the build output and print image ID on success
  -t, --tag list                Name and optionally a tag in the 'name:tag' format
      --target string           Set the target build stage to build.

许多人希望使用buildkit的选项是--progress=plain

docker build -t my-image --progress=plain .

如果你真的想看到以前的构建输出,你可以用一个环境变量禁用buildkit,但我倾向于建议不要这样做,因为buildkit中有很多功能你会失去(跳过未使用的构建步骤,并发构建步骤,多平台镜像,以及用于RUN --mount...等功能的Dockerfile的新语法):

DOCKER_BUILDKIT=0 docker build -t my-image .

OP要求在映像本身中包含其构建的日志。通常我建议不要这样做,您希望这些日志在映像之外。
也就是说,最简单的方法是使用tee将所有命令输出的副本发送到日志文件。如果您希望将其附加到映像,请将运行命令输出到映像内部的日志文件,如下所示:

RUN my-install-cmd | tee /logs/my-install-cmd.log

然后,您可以运行一个快速的一次性容器来查看这些日志的内容:

docker run --rm my-image cat /logs/my-install-cmd.log

如果你不需要将日志附加到镜像中,你可以记录每次构建的输出,只需对构建命令做一次修改(而不是对运行命令做大量修改),就像JHarris说的那样:

docker build -t my-image . | tee my-image.build.log

使用经典的docker build命令,如果您不使用--rm=true进行构建,那么您将拥有所有中间容器,并且每个中间容器都有一个日志,您可以使用

docker logs $container_id

最后,不要忘记图像中有一个层的历史记录。它们不显示每个命令的输出,但它对所有不记录任何输出的命令都很有用,并且知道每个层来自哪个构建,特别是当使用大量缓存时。

docker history my-image
drnojrws

drnojrws3#

除了使用--progress=plain,还可以使用环境变量BUILDKIT_PROGRESS
您可以按以下方式使用它:

export BUILDKIT_PROGRESS=plain
docker build ....

参考:https://docs.docker.com/engine/reference/commandline/buildx_build/#progress

zy1mlcev

zy1mlcev4#

使用此:https://github.com/jcalles/docker-wtee
阅读说明,请给予我反馈。
或者...
如果您需要从正在运行的container获取日志,并且container已暴露卷,请运行以下命令:

docker run --rm -it --name testlogs --link <CONTAINERNAME/ID> --network CONTAINERNETWORK -p PORT:8080 --volumes-from CONTAINERNAME/ID  javiercalles/wtee sh

相关问题