为什么Docker映像不在包含-t的情况下运行?

为什么Docker映像不在包含-t的情况下运行?,docker,dockerfile,Docker,Dockerfile,希望这是Docker图片上的最后一个问题,请继续。我发现当run命令中包含-t时,Docker映像不会运行。因此,docker run-it--version只是在没有输出的情况下退出。但是,如果我删除了-it,甚至只是删除了-t,它会按照我的预期输出版本 我的问题是,为什么不使用伪tty来处理-t?所使用的ocaml/opam图像是否会以某种方式防止这种情况发生 Dockerfile FROM ocaml/opam SHELL ["/bin/sh", "-lc"] LABEL io.whal

希望这是Docker图片上的最后一个问题,请继续。我发现当
run
命令中包含
-t
时,Docker映像不会运行。因此,
docker run-it--version
只是在没有输出的情况下退出。但是,如果我删除了
-it
,甚至只是删除了
-t
,它会按照我的预期输出版本

我的问题是,为什么不使用伪tty来处理
-t
?所使用的ocaml/opam图像是否会以某种方式防止这种情况发生

Dockerfile

FROM ocaml/opam

SHELL ["/bin/sh", "-lc"]
LABEL io.whalebrew.name 'ocp-indent'
LABEL io.whalebrew.config.working_dir '/workdir'
WORKDIR /workdir

RUN opam init --auto-setup
RUN opam install --yes ocp-indent
RUN ocp-indent --help

COPY docker-entrypoint.sh /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["--help"]
docker-entrypoint.sh

#!/bin/sh -l
ocp-indent "$@"

如果删除
sh
登录选项(
sh-l
),则伪tty(
docker run-t
)的输出将正常工作

这似乎是该Dockerfile的一个全局问题。加载登录配置文件后运行任何二进制命令都会做出相同的反应:

→ docker run -ti --entrypoint=/bin/sh 4ead19c50fc7 -c "tail -2 /etc/passwd"
messagebus:x:104:107::/var/run/dbus:/bin/false
opam:x:1000:1000:,,,:/home/opam:/bin/bash

→ docker run -ti --entrypoint=/bin/sh 4ead19c50fc7 -lc "tail -2 /etc/passwd"
→ 
而在运行base
ocaml/opam
image的容器中,使用登录shell的命令可以:

→ docker run ocaml/opam sh -lc "tail -2 /etc/passwd"
messagebus:x:104:107::/var/run/dbus:/bin/false
opam:x:1000:1000:,,,:/home/opam:/bin/bash

→ docker run ocaml/opam sh -c "tail -2 /etc/passwd"
messagebus:x:104:107::/var/run/dbus:/bin/false
opam:x:1000:1000:,,,:/home/opam:/bin/bash
opam init--auto setup
步骤可能会覆盖图像中的一些Docker细节。您可以将其从
Dockerfile
中删除,并使用命令的特定路径。我不太熟悉ocaml,所以不确定这是否是实现它的“方法”

FROM ocaml/opam

LABEL io.whalebrew.name 'ocp-indent'
LABEL io.whalebrew.config.working_dir '/workdir'
WORKDIR /workdir

RUN set -uex; \
    opam install -vv --yes ocp-indent; \
    /home/opam/.opam/4.04.2/bin/ocp-indent --help

ENTRYPOINT ["/home/opam/.opam/4.04.2/bin/ocp-indent"]
CMD ["--help"]

谢谢马特的解释。我对更改入口点犹豫不决,因为在某个时候ocaml/opam将更新并使用4.05.0,我不想每次更改Dockerfile。我试过一件事,也许你可以告诉我这是不是个坏主意,那就是改变
#/bin/sh-l
#/bin/bash-l
。这似乎解决了问题。通常我会尝试在Dockerfile或支持文件中保持应用程序的所有配置可见,而不是在
-l
源的随机配置文件中。其他语言包管理器,如
npm
composer
可以创建指向特定版本的通用
bin
链接作为安装的一部分,也许
opam
有这样做的选项?但是如果bash有效的话。。。有效:)