一个已停止的Docker容器的访问日志

21

最近我因为过去的Docker容器占用了空间,不得不清理我的满盘。所以我认为我可以访问已被终止容器的日志。

例如,我有一个容器的Docker历史记录:

$ docker history xxx_app
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
d7cfe17fc42a        56 minutes ago      /bin/sh -c #(nop)  EXPOSE 3000/tcp              0 B                 
cd26ca1108f0        56 minutes ago      /bin/sh -c #(nop) COPY dir:8daa84a931569267ab   62.27 MB            
6fa873fcc7bb        9 days ago          /bin/sh -c npm install && npm cache clean       177.8 MB            
67a23b0934d8        9 days ago          /bin/sh -c #(nop) COPY file:5dcb2a83410d0aa7f   1.529 kB            
3b7197885c91        3 weeks ago         /bin/sh -c #(nop)  ENV NODE_ENV=                0 B                 
79a447242ea5        3 weeks ago         /bin/sh -c #(nop)  ARG NODE_ENV                 0 B                 
b1909b86ce39        3 weeks ago         /bin/sh -c #(nop)  CMD ["npm" "start"]          0 B                 
<missing>           3 weeks ago         /bin/sh -c #(nop)  ONBUILD COPY . /usr/src/ap   0 B                 
<missing>           3 weeks ago         /bin/sh -c #(nop)  ONBUILD RUN npm install &&   0 B                 
<missing>           3 weeks ago         /bin/sh -c #(nop)  ONBUILD COPY package.json    0 B                 
<missing>           3 weeks ago         /bin/sh -c #(nop)  ONBUILD ENV NODE_ENV $NODE   0 B                 
<missing>           3 weeks ago         /bin/sh -c #(nop)  ONBUILD ARG NODE_ENV         0 B                 
<missing>           3 weeks ago         /bin/sh -c #(nop)  WORKDIR /usr/src/app         0 B                 
...

但是当我访问日志时,我遇到了一个错误:

docker logs 67a23b0934d8
Error: No such container: 67a23b0934d8
尽管如此,由于创建的容器镜像,我的磁盘空间正在变满,因此我不得不在大约一个月前采取行动,根据这篇文章进行清理。那么,我可以访问过去的日志吗?
附注:我对Docker并不是很了解,我接手了一个项目。每次代码更新后,容器重新启动的方式如下:
docker-compose -f docker-compose-production.yaml down
docker-compose -f docker-compose-production.yaml up -d --build

1
你在混淆图像和容器吗?history用于图像,但你试图使用图像ID来获取容器的日志。 - Henry
2个回答

32

默认情况下,销毁容器也会删除日志。如果需要日志,则必须指定--log-driver选项。在现代GNU/Linux盒子上,例如使用docker run命令,使用journald。

docker run --log-driver=journald

另一个使用docker-compose.yml语法的示例:

mycontainer:
    image: myimage
    logging:
        driver: journald
        options:
            tag: mytag

然后使用journalctl命令+筛选规则访问访问日志

journalctl -u docker CONTAINER_NAME=mycontainer_name

journalctl -u docker CONTAINER_TAG=mytag

当你运行一个多服务应用程序(例如使用docker-compose)时,标签是非常有用的。

我认为在你的情况下,容器是使用docker-compose“重新创建”的,因此如果你不指定logging-driver内容,日志将与容器生命周期相关联。

此外,Docker history命令与镜像相关联,而不是容器(容器==指定镜像的运行实例)。


1
很棒的解决方案!另外一个问题:journald 默认会滚动或压缩日志吗?还是它会在磁盘已满时写满磁盘? - wearego
@wearego 它可以压缩、翻转和执行许多操作。但是你必须在Docker主机上进行配置。https://www.freedesktop.org/software/systemd/man/journald.conf.html# - Paulo Neves
在OSX上,我应该使用什么来替代journald? - ekkis

20

由于问题说明容器被kill而不是销毁(移除),因此您仍然可以通过docker logs <container-id>访问未运行容器的日志。

您可以使用docker ps -a查找未运行容器的ID。

只要您使用默认的Docker日志记录驱动程序即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接