如何在bash脚本中启动Docker容器的多个进程

时间:2014-04-02 09:30:54

标签: bash docker

当我构建并运行docker容器时,我发现了非常奇怪的行为。我想要有cassandra和ssh的容器。 在我的Dockerfile中,我得到了:

RUN echo "deb http://www.apache.org/dist/cassandra/debian 20x main" | sudo tee -a /etc/apt/sources.list
RUN echo "deb-src http://www.apache.org/dist/cassandra/debian 20x main" | sudo tee -a /etc/apt/sources.list
RUN gpg --keyserver pgp.mit.edu --recv-keys 4BD736A82B5C1B00  
RUN apt-key add ~/.gnupg/pubring.gpg  
RUN apt-get update
RUN apt-get -y install cassandra

然后是ssh

RUN apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo '{{ docker_ssh_user }}:{{docker_ssh_password}}' | chpasswd
EXPOSE 22

我添加了启动脚本来运行我想要的所有内容:

USER root
ADD start start
RUN chmod 777 start

CMD ["sh" ,"start"]

这就是问题所在。当我开始时如下:

#!/bin/bash
/usr/sbin/sshd -D
/usr/sbin/cassandra -f

SSH运行良好。我可以做ssh root@172.17.0.x。登录容器后,我尝试运行cqlsh以确保cassandra正常工作。但cassandra由于某种原因未启动,我无法访问cqlsh。我还检查了/var/log/cassandra/,但它是空的。

在第二种情况下,我将启动脚本更改为:

#!/bin/bash
/usr/sbin/sshd -D & /usr/sbin/cassandra/ -f

我再次尝试连接ssh root@172.17.0.x,然后当我在容器内运行cqlsh时,我已连接到cqlsh

所以我认为&符号&正在做一些voodoo一切都运作良好? 为什么我不能用另一个命令运行bash staring脚本? 或者我错过了其他什么?

感谢阅读&&帮助

1 个答案:

答案 0 :(得分:2)

感谢我的朋友linux guru,我们找到了错误的原因。

/usr/sbin/sshd -D表示-D指定此选项时,sshd不会分离,也不会成为守护程序。这样可以轻松监控sshd

所以在第一个脚本sshd -D阻止下一个命令运行。 在第二个脚本中,我有&sshd -D进入背景,然后cassandra可以开始。 最后我得到了这个版本的脚本:

#!/bin/bash
/usr/sbin/sshd
/usr/sbin/cassandra -f