【发布时间】:2017-01-22 00:24:36
【问题描述】:
我不完全确定这里发生了什么,但是当我在容器中运行我的代码时,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。我看到以交互方式和在后台运行容器的行为相同。
Docker 版本:
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}' 即可观察。在 wheezy VM(不涉及 docker)上运行 procwrap 不会缓冲输出。
信任:
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
喘息:
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
【问题讨论】: