1

我有一个从 ubuntu 基础映像构建的 docker 映像,安装了一些软件。

我有一个启动脚本,如下

#!/bin/bash
/usr/local/sbin/process1 -d
/usr/local/sbin/process2 -d 
/bin/bash

现在我使用 docker-py python 库从一个 python 文件启动多个这些容器。

c = docker.Client(base_url='unix://var/run/docker.sock',
              version='1.12',
              timeout=10)

container = c.create_container("p12", command="/startup.sh", hostname=None, user=None,
               detach=False, stdin_open=False, tty=False, mem_limit=0,
               ports=None, environment=None, dns=None, volumes=None,
               volumes_from=None, network_disabled=False, name=None,
               entrypoint=None, cpu_shares=None, working_dir=None,
               memswap_limit=0)

c.start(container, binds=None, port_bindings=None, lxc_conf=None,
    publish_all_ports=False, links=None, privileged=False,
    dns=None, dns_search=None, volumes_from=None, network_mode=None,
    restart_policy=None, cap_add=None, cap_drop=None)

这很好用,当我在 Ubuntu 桌面、Ubuntu 14.04.1 LTS 和 1.10 的 docker-py 版本上测试它时,我可以启动多个(比如 3 个)。它将启动码头工人,我可以稍后进行码头附加并在终端上工作。

现在我将我的测试环境转移到了一个带有 Ubuntu 14.04.1 LTS 和 docker-py 版本 1.12 的 Ubuntu Server 版本。

我看到的问题是,当我使用相同的脚本并尝试启动 3 个 docker 时,在将 process1 和 process 2 作为后台进程启动后,所有 docker 都会退出。似乎 /bin/bash 根本没有执行。

如果我执行与“docker run -t -i p14 /startup.sh -->”相同的 docker 映像,那么一切都会再次正常。docker 已正确启动,我可以访问终端。

唯一的问题是当我执行这个 python 库时。

任何人有任何类似的问题...有关如何调试此问题的任何想法...或任何修复指针?

谢谢,基兰

4

1 回答 1

2

不同之处在于,当您使用 运行 docker 映像时,您处于tty( -t) 模式并打开stdin( ) ,而您在配置中同时设置和。-idocker run -t -i p14 /startup.shstdin_open=Falsetty=Falsedocker-py

因为您的 docker 容器没有也不tty能从 中获取任何输入stdin,所以您的调用/bin/bash与代码 0 无关,因此退出。

自己试试:

带有 tty 的开放标准输入

$ docker run -t -i ubuntu:14.04 /bin/bash                                  
root@1e7eda2bba03:/# ls -la                                                
total 7184                                                                 
drwxr-xr-x  21 root root    4096 Sep 19 21:30 .                            
drwxr-xr-x  21 root root    4096 Sep 19 21:30 ..                           
-rwxr-xr-x   1 root root       0 Sep 19 21:30 .dockerenv                   
-rwx------   1 root root 7279686 Jul 21 10:50 .dockerinit                  
drwxr-xr-x   2 root root    4096 Sep  3 03:33 bin                          
drwxr-xr-x   2 root root    4096 Apr 10 22:12 boot                         
drwxr-xr-x   4 root root     360 Sep 19 21:30 dev                          
drwxr-xr-x  61 root root    4096 Sep 19 21:30 etc                          
drwxr-xr-x   2 root root    4096 Apr 10 22:12 home                         
drwxr-xr-x  12 root root    4096 Sep  3 03:33 lib                          
drwxr-xr-x   2 root root    4096 Sep  3 03:33 lib64                        
drwxr-xr-x   2 root root    4096 Sep  3 03:33 media                        
drwxr-xr-x   2 root root    4096 Apr 10 22:12 mnt                          
drwxr-xr-x   2 root root    4096 Sep  3 03:33 opt                          
dr-xr-xr-x 240 root root       0 Sep 19 21:30 proc                         
drwx------   2 root root    4096 Sep  3 03:33 root                         
drwxr-xr-x   7 root root    4096 Sep  3 03:33 run                          
drwxr-xr-x   2 root root    4096 Sep  4 18:41 sbin                         
drwxr-xr-x   2 root root    4096 Sep  3 03:33 srv                          
dr-xr-xr-x  13 root root       0 Sep 19 18:44 sys                          
drwxrwxrwt   2 root root    4096 Sep  4 18:41 tmp                          
drwxr-xr-x  10 root root    4096 Sep  3 03:33 usr                          
drwxr-xr-x  11 root root    4096 Sep  3 03:33 var                          
root@1e7eda2bba03:/#  

没有 tty 的开放标准输入(即没有提示,但您仍然可以通过标准输入发送命令)

$ docker run -i ubuntu:14.04 /bin/bash                                     
ls -la                                                                     
total 7184                                                                 
drwxr-xr-x  21 root root    4096 Sep 19 21:32 .                            
drwxr-xr-x  21 root root    4096 Sep 19 21:32 ..                           
-rwxr-xr-x   1 root root       0 Sep 19 21:32 .dockerenv                   
-rwx------   1 root root 7279686 Jul 21 10:50 .dockerinit                  
drwxr-xr-x   2 root root    4096 Sep  3 03:33 bin                          
drwxr-xr-x   2 root root    4096 Apr 10 22:12 boot                         
drwxr-xr-x   4 root root     340 Sep 19 21:32 dev                          
drwxr-xr-x  61 root root    4096 Sep 19 21:32 etc                          
drwxr-xr-x   2 root root    4096 Apr 10 22:12 home                         
drwxr-xr-x  12 root root    4096 Sep  3 03:33 lib                          
drwxr-xr-x   2 root root    4096 Sep  3 03:33 lib64                        
drwxr-xr-x   2 root root    4096 Sep  3 03:33 media                        
drwxr-xr-x   2 root root    4096 Apr 10 22:12 mnt                          
drwxr-xr-x   2 root root    4096 Sep  3 03:33 opt                          
dr-xr-xr-x 243 root root       0 Sep 19 21:32 proc                         
drwx------   2 root root    4096 Sep  3 03:33 root                         
drwxr-xr-x   7 root root    4096 Sep  3 03:33 run                          
drwxr-xr-x   2 root root    4096 Sep  4 18:41 sbin                         
drwxr-xr-x   2 root root    4096 Sep  3 03:33 srv                          
dr-xr-xr-x  13 root root       0 Sep 19 18:44 sys                          
drwxrwxrwt   2 root root    4096 Sep  4 18:41 tmp                          
drwxr-xr-x  10 root root    4096 Sep  3 03:33 usr                          
drwxr-xr-x  11 root root    4096 Sep  3 03:33 var   

带有 tty 的封闭标准输入(可以看到提示但不能输入任何命令)

$ docker run -t ubuntu:14.04 /bin/bash
root@95904c21e5a5:/# ls -la
hello
this does nothing :(

没有 tty 的封闭标准输入 - /bin/bash 无关

$ docker run ubuntu:14.04 /bin/bash
$ 
于 2014-09-19T21:34:04.637 回答