2017-09-26 87 views
0

希望这个Docker映像上最后一个问题,从Docker image run results in executable not found in path继续。我发现在run命令中包含-t时,Docker映像无法运行。所以docker run -it <image> --version只是退出没有输出。但是,如果我删除-it甚至只是删除-t,它会按我的预期输出版本。为什么Docker映像不能与-t一起运行?

我的问题是,为什么它不能与-t一起使用伪tty? 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 "[email protected]" 

回答

1

如果删除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" 
→ 

而在容器中运行的基ocaml/opam图像,命令使用登录壳都OK:

→ 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"] 
+0

感谢马特的解释。我很犹豫是否要更改入口点,因为在某些时候ocaml/opam会更新并使用4.05.0,并且我不想每次更改时都更改Dockerfile。我尝试过的一件事,也许你可以告诉我,如果这是一个坏主意,将'#!/ bin/sh -l'改为'#!/ bin/bash -l'。这似乎解决了它。 – user1795832

+0

通常我会尝试在Dockerfile或支持文件中显示应用程序的所有配置,而不是在'-l'源文件的随机配置文件中。作为安装的一部分,其他语言包管理器如'npm'或'composer'可以为特定的版本创建一个通用的'bin'链接,也许'opam'可以选择这样做?但如果bash的作品...它的作品:) – Matt

相关问题