【问题标题】:Why 'irb' shell exits instantaneously in docker command为什么 'irb' shell 在 docker 命令中立即退出
【发布时间】:2021-06-09 12:38:47
【问题描述】:

这是我的 Dockerfile。

FROM ruby:2.4.0-alpine
RUN mkdir /app
WORKDIR /app
COPY Gemfile ./Gemfile
COPY Gemfile.lock ./Gemfile.lock
RUN bundle install -j 20
COPY . .

这是我的 docker-compose 文件:

version: '2'
services:
  web:
    build: .
    command: "irb"
    volumes:
      - .:/app

我预计docker-compose up 会打开一个 irb shell,但是 shell 会立即退出。为什么会退出?

如何通过 docker 使用 irb shell?

【问题讨论】:

标签: ruby docker docker-compose irb


【解决方案1】:

docker-compose up 没有为 IRB 分配 TTY,所以 IRB 立即退出。你可以使用docker-compose rundocker-compose exec 来实现你想要的,它们都分配了一个伪TTY:

$ docker-compose run web irb
Creating compose-irb_web_run ... done
irb(main):001:0>

或者,如果您修改docker-compose.yml 中的命令(见下文),运行docker-compose up,您可以使用docker-compose exec web irb 在正在运行的容器内执行irb

version: '2'
services:
  web:
    build: .
    command: sh -c 'while true; do sleep 30; done'
    volumes:
      - .:/app

【讨论】:

  • 谢谢@ezekiel,您能否评论一下为什么 irb 命令(我使用它的方式)会立即退出?
  • @AsadIqbal 因为docker-compose up 没有分配 TTY 而 irb 需要一个。
  • 这是一个很好的答案,它有帮助。我还查看了 tty 是什么,如果有人想知道,简而言之,它使终端具有交互性并允许用户输入,这使得 irb 需要一个是有道理的。 docker compose 没有分配 tty 的事实最终会关闭容器,因此上述解决方案非常适合保持容器运行。