首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在docker中运行的sinatra需要tty选项来记录main?

为什么在docker中运行的sinatra需要tty选项来记录main?
EN

Stack Overflow用户
提问于 2020-10-11 20:02:02
回答 1查看 91关注 0票数 0

Dockerfile

代码语言:javascript
复制
FROM ruby:2.7-alpine
RUN gem install sinatra
代码语言:javascript
复制
$ docker build -t sinatra .

test.rb

代码语言:javascript
复制
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不会打印任何内容。

代码语言:javascript
复制
$ 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选项,它们可以按顺序打印。

代码语言:javascript
复制
$ 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相关的行注释掉,就像这样;

代码语言:javascript
复制
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选项的情况下,日志和看跌期权按预期打印。

代码语言:javascript
复制
$ 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
EN

回答 1

Stack Overflow用户

发布于 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 (这是大多数命令行可执行文件所期望的)并传递信号。所有这些都是可配置的:

代码语言:javascript
复制
-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 。您可以指定要连接到三个标准流(STDINSTDOUTSTDERR)中的哪一个,如下所示:

代码语言:javascript
复制
$ docker run -a stdin -a stdout -i -t ubuntu /bin/bash
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64303780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档