DockerFile:启动后如何获取 bash 命令行?

rea*_*ebo 3 bash docker dockerfile

这个问题不重复,因为我想在不运行 -it 标志的情况下获得一个交互式 shell。

我正在向 Docker 迈出第一步,以创建仅供内部使用的图像。

我从这个开始envirornment_full.df

FROM ubuntu:16.04
ENTRYPOINT ["/bin/bash"]
Run Code Online (Sandbox Code Playgroud)

然后我建立

docker rmi environment:full
docker build -t environment:full  -f environment.df .
Run Code Online (Sandbox Code Playgroud)

然后运行

docker run environment:full
Run Code Online (Sandbox Code Playgroud)

运行docker images -a我看到我的形象

REPOSITORY          TAG                 IMAGE ID            CREATED         SIZE
environment         full                aa91bbd39167        4 seconds ago   129 MB
Run Code Online (Sandbox Code Playgroud)

所以我运行它

docker run environment:full 
Run Code Online (Sandbox Code Playgroud)

我什么都没看到....

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED         STATUS                      PORTS               NAMES
5847c0a18f30        environment:full    "/bin/bash"         21 seconds ago  Exited (0) 20 seconds ago                       admiring_mirzakhani
Run Code Online (Sandbox Code Playgroud)

$ docker run environment:full -ti
bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell
root@aa768a585f33:/# exit
Run Code Online (Sandbox Code Playgroud)

我想要 ubuntu 提示,就像我在 SSH 连接中一样。这没有用户必须输入 -i 或 -tty flags

我怎么能意识到这一点?

lar*_*sks 5

bash将不会运行在所有的,如果标准输入被关闭。如果您不提供-i标志,bash将立即退出。所以当你...

docker run environment:full 
Run Code Online (Sandbox Code Playgroud)

...bash 立即退出,因此您的容器退出。如果您运行docker ps -a,您会看到它,它显示已停止的容器。

bash如果未附加到 tty,则不会给您交互式提示。所以如果你要跑...

coerk run -i environment:full
Run Code Online (Sandbox Code Playgroud)

...您将获得一个bash外壳,但没有提示、作业控制或其他功能。您需要-t为 Docker 分配一个 tty 设备。

如果不在命令行中同时提供-i-t选项,您将无法获得想要的东西。

另一种方法是设置一个运行 ssh 守护程序的映像,并让人们通过 ssh 进入容器。它不会表现得“就像我在 SSH 连接中一样”,它实际上是一个 ssh 会话。

另外,请注意:

docker run environment:full -ti
Run Code Online (Sandbox Code Playgroud)

和这个不一样:

docker run -it environment:full
Run Code Online (Sandbox Code Playgroud)

前者将bash -ti在容器内运行,而后者将-i-t选项传递给docker run

  • 谢谢 !在“不可能”的情况下,这是一个示例性的答案。你已经解释了原因并且做得很好。 (2认同)