为什么Docker镜像不能与-t一起运行?
希望这个Docker镜像的最后一个问题继续从Docker镜像运行导致在path中找不到可执行文件 。 我发现当run
命令中包含-t
时Docker镜像不run
。 所以docker run -it <image> --version
只是退出没有输出。 但是,如果我删除-it
,甚至只是删除-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 "$@"
如果删除sh
login选项( sh -l
),那么使用伪tty( docker run -t
)输出将正常工作。
这似乎是Dockerfile的全局问题。 加载loginconfiguration文件后运行任何二进制命令将作出相同的反应:
→ 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
映像的容器中,使用loginshell的命令正常:
→ 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
删除它,并使用该命令的特定path。 我不是很熟悉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"]