stdout 在 docker 容器中缓冲

2023-11-25

我不完全确定这里发生了什么,但当我在容器中运行代码时,stdout 似乎正在被缓冲,但如果我在主机或 OSX 上运行它,则不会。

https://github.com/myles-mcdonnell/procwrap/blob/master/procwrap.go

相关部分(为简洁而修改):

    cmd := exec.Command("ping", "127.0.0.1")

    logger := &lumberjack.Logger{
        Filename:   conf.LogFile,
        MaxSize:    conf.MaxLogSizeMb,
        MaxBackups: conf.MaxLogBackups,
        MaxAge:     conf.MaxLogAgeDays,
    }

    cmd.Stdout = io.MultiWriter(os.Stdout, logger)  

    err := cmd.Run()

在容器中运行时,子进程运行良好,但我只能每隔一段时间看到输出(到标准输出和日志文件),就像正在刷新缓冲区一样。在容器外部运行它并在生成时输出。我正在使用 go 1.6.3。我看到在后台以交互方式运行容器的相同行为。

码头工人版本:

Client:
 Version:      1.10.3
 API version:  1.22
 Go version:   go1.5.3
 Git commit:   20f81dd
 Built:        Thu Mar 10 21:49:11 2016
 OS/Arch:      darwin/amd64

Server:
 Version:      1.12.0
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   8eab29e
 Built:        Thu Jul 28 23:54:00 2016
 OS/Arch:      linux/amd64

=======更新======

我看到基于基本图像的不同行为。在 debian:wheezy 基础上运行 procwrap 我得到缓冲输出。在 ubuntu:trusty 上做同样的事情,它是同步的。下面的 Dockerfiles,只需在每个文件上执行“docker run {image_name}”即可观察。在喘息的虚拟机(不涉及 docker)上运行 procwrap 不会缓冲输出。

TRUSTY:

FROM ubuntu:trusty
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y git
RUN curl -O https://storage.googleapis.com/golang/go1.6.3.linux-amd64.tar.gz
RUN tar -xvf go1.6.3.linux-amd64.tar.gz
RUN mv go /usr/local
ENV GOROOT=/usr/local/go
RUN mkdir -p /go/src/github.com/myles-mcdonnell
ENV GOPATH=/go
ENV PATH=$PATH:$GOPATH/bin:$GOROOT/bin
RUN go get github.com/myles-mcdonnell/procwrap
WORKDIR /go/src/github.com/myles-mcdonnell/procwrap
CMD procwrap -v

WHEEZY:

FROM debian:wheezy
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y git
RUN curl -O https://storage.googleapis.com/golang/go1.6.3.linux-amd64.tar.gz
RUN tar -xvf go1.6.3.linux-amd64.tar.gz
RUN mv go /usr/local
ENV GOROOT=/usr/local/go
RUN mkdir -p /go/src/github.com/myles-mcdonnell
ENV GOPATH=/go
ENV PATH=$PATH:$GOPATH/bin:$GOROOT/bin
RUN go get github.com/myles-mcdonnell/procwrap
WORKDIR /go/src/github.com/myles-mcdonnell/procwrap
CMD procwrap -v

我遇到了同样的问题,看起来根本原因是“标准输出缓冲”。 您可以开始阅读http://www.pixelbeat.org/programming/stdio_buffering/如果有任何其他问题,请使用谷歌。 我无法通过“stdbuf”或任何 linux/app 设置来解决它,并更改了我想要 dockerize 的控制台应用程序的源代码,以便在每次写入时继续进行文件刷新。

(由于很多原因,我的配置很奇怪,但它是:应用程序已将日志输出配置到名为“/dev/stdout”的文件,并且它在每次日志写入时执行 file_flush,并且 docker 可以在“上实时显示消息” docker 日志 -f XXXXX")

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stdout 在 docker 容器中缓冲 的相关文章

随机推荐

  • JavaScript 条件 switch 语句

    有没有办法在 JavaScript 中编写条件 switch 语句 我猜不会 因为以下内容总是会发生default var raw value 11 0 switch raw value case raw value gt 10 0 hei
  • 如何使用 Twitter API v2 的 tweepy 通过用户名获取用户 ID?

    我正在尝试从 geeksforgeeks 复制此代码片段 只不过它使用 Twitter API v1 1 的 oauth 而我使用 API v2 the screen name of the user screen name Practic
  • 在 R 中使用“foreach()”函数时如何创建进度条?

    有一些关于如何在 R 程序中创建循环计数器的信息丰富的帖子 但是 当使用带有 foreach 的并行版本时 如何创建类似的函数 编辑 之后update到 doSNOW 包 使用时显示漂亮的进度条变得非常简单 dopar 它适用于 Linux
  • Android 中的地理标记

    如何通过代码知道Android相机设置中的地理标记是否启用或禁用 我们通过代码将地理标签附加到照片上 我们使用位置管理器 位置监听器来获取纬度和经度 并使用 Exif 接口将此坐标保存到照片中 ExifInterface exif new
  • android中如何获取Webview的宽度和高度

    我想确定的宽度和高度WebView 我已经尝试过使用 webView getWidth webView getHeight 但生成的日志始终显示它们为 0 这是一个更优雅的解决方案 public void onCreate Bundle s
  • ES6中扩展类时是否可以定义回调

    本质上 如果我的库类被调用 我想做一些设置工作 例如 class Child extends Parent methods 我想分配一个在扩展父类时调用的函数 我希望以某种方式得到通知 在它即将发生之前 使用要作为参数附加的方法 或在使用
  • 无法在 Android NDK 中包含像矢量这样的 C++ 标头

    当我尝试在我的 Android NDK 项目中包含任何 C 类 例如向量 时 使用最新的 NDK r5b 我收到如下错误 Compile thumb test libstl lt test libstl cpp Users nitrex88
  • CSS 过渡忽略宽度

    我有一个显示为块的标签 页面加载时 其宽度会增加 css动画片从零到包含 div 的某个百分比 小提琴包含一个 MWE 但此 div 中有多个链接 每个链接都有不同的宽度 悬停时 我希望它使用 CSS 改变颜色 改变背景颜色 并扩展到 di
  • 去替换所有字符串

    我阅读了示例代码golang org 网站 本质上 代码如下所示 re regexp MustCompile a x b fmt Println re ReplaceAllString ab axxb T fmt Println re Re
  • CSS:在 CSS 中设置背景图像

    在 CSS 中设置背景图像时 正确的语法是什么 在Visual Studio中 自从出现以来 后台似乎没有任何问题 但在IE或FF等浏览器中 背景不会出现 我在这里错过了什么吗 我使用的语法如下 我认为是正确的 headerArea hei
  • Xerces-C:从 v2.x 迁移到 v3.x?

    我想将一个项目 我不太熟悉的遗留代码 从 Xerces C v2 x 迁移到 v3 x 事实证明 Xerces C v3 删除了 DOMBuilder 类 这迁移档案告诉我这个 作为最终 DOM Level 3 规范一致性工作的一部分 许多
  • Django post_save() 信号实现

    我有一个关于 django 的问题 我这里有ManyToMany模型 class Product models Model name models CharField max length 255 price models DecimalF
  • 如何将数据类型 CLOB 更改为 VARCHAR2(sql)

    表 客户 ID NAME DATATYPE NUMBER VARCHAR2 100 CLOB 我想改变DATA专栏来自CLOB到 VARCHAR2 1000 我已经尝试过ALTER TABLE customers MODIFY DATA V
  • 如何使用键值删除字典数组中的对象

    我有一个字典数组 如下所示 photo id 255025344921316 photo url https scontent xx fbcdn net v t1 0 0 p320x320 16143181 255025344921316
  • React 如何使用 TypeScript 在 Textfield Material-UI 中使用图标

    我使用 TypeScript Material UI 和 Formik 设计了一个带有验证的表单 我想要一个材质 UI 图标出现在我的文本字段区域中 这是我的代码 import React from react import Formik
  • 惰性变量定义后括号做什么?

    我正在分析一些第三方代码 有一个看起来像这样的 惰性 var 语句 我想了解 计算属性 大括号后面的括号在做什么 lazy var defaults NSUserDefaults return standardUserDefaults re
  • asp.net mvc 和 css:使菜单选项卡在选择时保持突出显示

    有一个更好的方法吗 我有一个 HTML 帮助器扩展方法 它检查当前选项卡菜单是否是选定的菜单 然后选择 selected css 类 我将 html IsSelected 链接放在每个 li 中 li class 其中 a 是选项卡名称 b
  • 批量 C# 数据表到 postgresql 表

    我有一个包含数千条记录的数据表 我有一个与数据表具有相同字段的 postgres 表 我想每天截断该表并再次填充数据表的数据 我见过sql批量复制 但它在postgres上不可用 那么 哪一种方法是最有效的呢 每条记录一次插入 多次插入 插
  • 结构类型嵌入字段访问

    我在尝试学习golang目前我正在尝试理解指针 我定义了三种结构类型 type Engine struct power int type Tires struct number int type Cars struct Engine Tir
  • stdout 在 docker 容器中缓冲

    我不完全确定这里发生了什么 但当我在容器中运行代码时 stdout 似乎正在被缓冲 但如果我在主机或 OSX 上运行它 则不会 https github com myles mcdonnell procwrap blob master pr