Docker容器不以ubuntu映像开头(docker start)

时间:2020-11-01 01:26:38

标签: docker

如果我使用docker container run ubuntu直接从Ubuntu映像运行容器,则可以使用docker start <CONTAINER ID>轻松地重新启动它。但是,我使用docker run <ID IMAGE>使用图像运行容器,一旦退出伪终端,它将完全丢失。

我注意到,每次尝试重新启动状态时,状态都会更新,这意味着主进程开始并立即停止。 有想法吗?

portaivan@training-vm:~$ docker image ls -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              d70eaf7277ea        8 days ago          72.9MB
portaivan@training-vm:~$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
4004895feff9        d70eaf7277ea        "/bin/bash"         3 hours ago         Exited (0) 3 hours ago                          heuristic_lovelace
3b1b521d62aa        ubuntu              "/bin/bash"         3 hours ago         Exited (0) 23 seconds ago                       sleepy_pike
portaivan@training-vm:~$ docker start 3b1b521d62aa
3b1b521d62aa
portaivan@training-vm:~$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS               NAMES
4004895feff9        d70eaf7277ea        "/bin/bash"         3 hours ago         Exited (0) 3 hours ago                       heuristic_lovelace
3b1b521d62aa        ubuntu              "/bin/bash"         3 hours ago         Up 2 seconds                                 sleepy_pike
portaivan@training-vm:~$ docker container start 4004895feff9
4004895feff9
portaivan@training-vm:~$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
4004895feff9        d70eaf7277ea        "/bin/bash"         3 hours ago         Exited (0) 2 seconds ago                       heuristic_lovelace
3b1b521d62aa        ubuntu              "/bin/bash"         3 hours ago         Up 17 seconds                                  sleepy_pike
portaivan@training-vm:~$ docker container start -i 4004895feff9
portaivan@training-vm:~$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
4004895feff9        d70eaf7277ea        "/bin/bash"         3 hours ago         Exited (0) 2 seconds ago                       heuristic_lovelace
3b1b521d62aa        ubuntu              "/bin/bash"         3 hours ago         Up 28 seconds                                  sleepy_pike

2 个答案:

答案 0 :(得分:1)

Docker容器在命令运行时仍然存在。
您的命令是"/bin/bash"

那是

伪终端

因此,当您关闭终端命令(又称容器入口点)时,容器停止。

  • 编辑1.详细说明

如果运行不带-it参数的容器,则会启动bash而不创建会话(pseudo-tty)。

例如,您可以运行:

bash -c "echo 'blabla'"

bash仅运行echo命令并结束进程。
因此,这是容器未退出的两个原因:

  1. 如果您跑步
docker container run -t --name u_container ubuntu

您将无法在容器内输入任何命令。由于未附加STDIN。但!您可以通过-t参数创建伪tty,而无需退出即可启动docker容器。

  1. 仅使用-i个参数bash时,不要创建tty并希望尽快死亡。但! docker保持容器运行,并尝试无限传递输入,即使您未附加到容器(请参阅帮助)。尽管我们可以停止bash插入exit
-i, --interactive Keep STDIN open even if not attached

所以,简单的解释:这取决于您如何运行shell。作为循环和侦听伪终端或仅作为命令解释器。 您可以将其与python进行比较。
如果运行python,它将是python shell。如果您运行python /script/script.py,则python只需执行script.py并停止。

答案 1 :(得分:1)

几个小时后,我明白了!问题是STDIN在容器运行时关闭。 我使用选项-i运行了容器1和容器2。 我运行了没有选项-i的Container 3。 如您在下图中所看到的,我能够启动Container 1和Container 2,但不能启动Container 3。

====原因! ====

每个进程都有三个数据流(STDIN / STDOUT / STDERR)。当容器中正在运行进程时,默认情况下,终端将与容器中正在运行的进程的STDOUT流连接。因此,在终端中运行docker run命令时,所有输出流都是可见的。但是,如果要向容器中正在运行的进程提供输入,则必须连接进程的STDIN通道,默认情况下这不是默认操作,而是通过docker run -i命令完成的。

portaivan@training-vm:~$ docker image ls -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
portaivan@training-vm:~$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
portaivan@training-vm:~$ docker container run -it --name container01 ubuntu
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
6a5697faee43: Pull complete
ba13d3bc422b: Pull complete
a254829d9e55: Pull complete
Digest: sha256:fff16eea1a8ae92867721d90c59a75652ea66d29c05294e6e2f898704bdb8cf1
Status: Downloaded newer image for ubuntu:latest
root@03b44b790cfa:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@03b44b790cfa:/# exit
exit
portaivan@training-vm:~$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
03b44b790cfa        ubuntu              "/bin/bash"         14 seconds ago      Exited (0) 5 seconds ago                       container01
portaivan@training-vm:~$ docker container start 03b44b790cfa
03b44b790cfa
portaivan@training-vm:~$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
03b44b790cfa        ubuntu              "/bin/bash"         28 seconds ago      Up 2 seconds                            container01
portaivan@training-vm:~$ docker image ls -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              d70eaf7277ea        8 days ago          72.9MB
portaivan@training-vm:~$ docker container run -it --name container02 d70eaf7277ea
root@e6123c0bbe81:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@e6123c0bbe81:/# exit
exit
portaivan@training-vm:~$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                     PORTS               NAMES
e6123c0bbe81        d70eaf7277ea        "/bin/bash"         10 seconds ago       Exited (0) 3 seconds ago                       container02
03b44b790cfa        ubuntu              "/bin/bash"         About a minute ago   Up About a minute                              container01
portaivan@training-vm:~$ docker container start e6123c0bbe81
e6123c0bbe81
portaivan@training-vm:~$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
e6123c0bbe81        d70eaf7277ea        "/bin/bash"         22 seconds ago       Up 2 seconds                            container02
03b44b790cfa        ubuntu              "/bin/bash"         About a minute ago   Up About a minute                       container01
portaivan@training-vm:~$ docker container run --name container03 d70eaf7277ea
portaivan@training-vm:~$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
7adbb0089b56        d70eaf7277ea        "/bin/bash"         3 seconds ago       Exited (0) 2 seconds ago                       container03
e6123c0bbe81        d70eaf7277ea        "/bin/bash"         2 minutes ago       Up About a minute                              container02
03b44b790cfa        ubuntu              "/bin/bash"         3 minutes ago       Up 2 minutes                                   container01
portaivan@training-vm:~$ docker container start 7adbb0089b56
7adbb0089b56
portaivan@training-vm:~$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
7adbb0089b56        d70eaf7277ea        "/bin/bash"         15 seconds ago      Exited (0) 2 seconds ago                       container03
e6123c0bbe81        d70eaf7277ea        "/bin/bash"         2 minutes ago       Up About a minute                              container02
03b44b790cfa        ubuntu              "/bin/bash"         3 minutes ago       Up 3 minutes                                   container01
portaivan@training-vm:~$

参考

https://docs-stage.docker.com/engine/reference/commandline/container_run/ https://www.howtogeek.com/435903/what-are-stdin-stdout-and-stderr-on-linux/