Dockerfile
FROM ruby:2.7-alpine
RUN gem install sinatra$ docker build -t sinatra .test.rb
require 'logger'
logger = Logger.new(STDOUT, level: :info)
logger.info 'log before sinatra'
puts 'puts before sinatra'
require 'sinatra'
get '/' do
'Hello world!'
end
logger.info 'log after sinatra'
puts 'puts after sinatra'如果不使用-t选项,则在C-c中断之前,puts和logger.info不会打印任何内容。
$ docker run --rm -v$PWD:/app sinatra ruby /app/test.rb
[2020-10-11 11:48:20] INFO WEBrick 1.6.0
[2020-10-11 11:48:20] INFO ruby 2.7.1 (2020-03-31) [x86_64-linux-musl]
== Sinatra (v2.1.0) has taken the stage on 4567 for development with backup from WEBrick
[2020-10-11 11:48:20] INFO WEBrick::HTTPServer#start: pid=1 port=4567使用-t选项,它们可以按顺序打印。
$ docker run -t --rm -v$PWD:/app sinatra ruby /app/test.rb
I, [2020-10-11T11:48:41.216144 #1] INFO -- : log before sinatra
puts before sinatra
I, [2020-10-11T11:48:41.553242 #1] INFO -- : log after sinatra
puts after sinatra
I, [2020-10-11T11:48:41.555356 #1] INFO -- : before sinatra
I, [2020-10-11T11:48:41.557748 #1] INFO -- : after sinatra
[2020-10-11 11:48:41] INFO WEBrick 1.6.0
[2020-10-11 11:48:41] INFO ruby 2.7.1 (2020-03-31) [x86_64-linux-musl]
== Sinatra (v2.1.0) has taken the stage on 4567 for development with backup from WEBrick
[2020-10-11 11:48:41] INFO WEBrick::HTTPServer#start: pid=1 port=4567那里发生了什么?
编辑:如果将sinatra相关的行注释掉,就像这样;
require 'logger'
logger = Logger.new(STDOUT, level: :info)
logger.info 'log before sinatra'
puts 'puts before sinatra'
# require 'sinatra'
# get '/' do
# 'Hello world!'
# end
logger.info 'log after sinatra'
puts 'puts after sinatra'在不使用-t选项的情况下,日志和看跌期权按预期打印。
$ docker run --rm -v$PWD:/app sinatra ruby /app/test.rb
I, [2020-10-12T23:54:28.138590 #1] INFO -- : log before sinatra
puts before sinatra
I, [2020-10-12T23:54:28.138678 #1] INFO -- : log after sinatra
puts after sinatra发布于 2020-10-12 12:41:18
如果您登录到STDOUT,则记录器似乎正在通过tty检测STDOUT。就像https://jameshfisher.com/2017/12/09/what-is-a-tty/中描述的那样
docker文档的目标是相同的方向:
https://docs.docker.com/engine/reference/run/#foreground
前景
在前台模式(未指定-d时的默认模式)下,docker run可以在容器中启动进程,并将控制台附加到进程的标准输入、输出和标准错误。它甚至可以伪装成TTY (这是大多数命令行可执行文件所期望的)并传递信号。所有这些都是可配置的:
-a=[] : Attach to `STDIN`, `STDOUT` and/or `STDERR`
-t : Allocate a pseudo-tty
--sig-proxy=true: Proxy all received signals to the process (non-TTY mode only)
-i : Keep STDIN open even if not attached如果不指定-a,Docker将执行attach to both stdout and stderr 。您可以指定要连接到三个标准流(STDIN、STDOUT、STDERR)中的哪一个,如下所示:
$ docker run -a stdin -a stdout -i -t ubuntu /bin/bashhttps://stackoverflow.com/questions/64303780
复制相似问题