2017-09-26 81 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

相關問題