docker - 查看临时 docker 容器的标准输出和日志

标签 docker

我知道有很多关于如何阅读 docker 日志的问题,这些问题的回答是:

$ docker logs containername

但是,我正在使用一个临时容器,该容器是使用 -rm 创建的,因此在创建它后我没有时间调用日志。但我仍然对查看它如何运行的日志感兴趣。

我的命令是:
docker run --name myname --rm  python-my-script:3.7.4 - --myflags "myargs"

现在,我想看看我的脚本如何使用这些参数运行。我的入口点有一个脚本,它应该有效地读取“myargs”并将其打印到控制台。

但是当我这样做时:
docker logs myname
Error: No such container: myname

或者,如果我真的很快:
Error response from daemon: can not get logs from container which is dead or marked for removal

如何查看不再运行的容器的日志?我不想安装像 syslog 这样重量级的东西。

最佳答案

Docker 的默认日志驱动程序是 json-file ,您可以使用 docker logs看见了。但是如果你删除容器或者使用 --rm运行容器时,删除容器后将删除日志。

对于您的情况,您需要更改日志驱动程序以确保即使在容器删除后仍然可以看到日志。

有很多日志驱动程序可以满足您的要求,请参阅 this .例如 fluentd、splunk 等。

这里,给出一个最简单的保留日志的方法,使用journald ,供您引用的最小示例:

  • 使用 journald 日志驱动启动容器,需要设置一个容器名称,稍后将用于检索日志:
    $ docker run --log-driver=journald --rm --name=trial alpine echo "hello world"
    
  • 容器完成打印“hello world”后,容器将被删除,因为它指定了--rm , 检查是否 docker logs好的:
    $ docker logs trial
    Error: No such container: trial
    
  • 如果我们可以获得日志,请使用 journald:
    $ journalctl CONTAINER_NAME=trial --all
    -- Logs begin at Mon 2018-12-17 21:35:55 CST, end at Mon 2019-08-05 14:21:19 CST. --
    Aug 05 14:18:26 shubuntu1 a475febe91c1[1975]: hello world
    

  • 你可以看到你可以使用 journalctl 来获取日志内容“hello world”,即使容器被移除。

    顺便说一句,如果您不想指定 --log-driver每次启动容器时,您也可以在 daemon.json 中将其设置为默认日志驱动程序,见 this :
    {
      "log-driver": "journald"
    }
    

    同时,您仍然可以使用docker logs如果容器未删除,则获取日志。

    关于docker - 查看临时 docker 容器的标准输出和日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57342946/

    相关文章:

    bash - 无法启动 docker nginx

    docker - 使用 ansible 构建多阶段 docker 镜像

    mongodb - docker mongodb 配置文件

    docker:来自守护进程的错误响应:ttrpc:已关闭:未知。将containerd升级到1.4.0后

    Bash 实例未嵌套在 Dockerfile `RUN` 中

    Docker Swarm,如何仅通过它们的 "hostname"与其他服务通信?

    visual-studio - 在解决方案中存在网站项目时,在Visual Studio中构建DockerCompose项目会出错

    ruby-on-rails - 如何以编程方式获取正在运行的容器的容器 ID(在 Docker 上)?

    nexus repo 的 Docker 登录错误

    docker - 为什么使用 AUFS 作为默认的 Docker 存储后端而不是 devicemapper?