如何在运行docker容器时自动启动服务?

mtm*_*ald 151 docker

我有一个Dockerfile来安装MySQL服务器在一个容器中,然后我这样开始:

sudo docker run -t -i 09d18b9a12be /bin/bash
Run Code Online (Sandbox Code Playgroud)

但MySQL服务不会自动启动,我必须手动运行(从容器内):

service mysql start
Run Code Online (Sandbox Code Playgroud)

运行docker容器时如何自动启动MySQL服务?

Lar*_*Cai 198

首先,你的问题Dockerfile:

RUN service mysql restart && /tmp/setup.sh
Run Code Online (Sandbox Code Playgroud)

Docker镜像不保存正在运行的进程.因此,您的RUN命令仅在docker build阶段执行,并在构建完成后停止.相反,您需要在使用CMDENTRYPOINT如下命令启动容器时指定命令:

CMD mysql start
Run Code Online (Sandbox Code Playgroud)

其次,docker容器需要一个进程(last命令)来继续运行,否则容器将退出/停止.因此,正常service mysql start命令不能直接在Dockerfile中使用.

有三种典型的方法可以保持进程运行:

当您运行单个服务时,这通常是首选,因为它使得对接器可以访问输出的日志.

这只适用于有脚本的情况mysqld_safe.

如果命令必须执行一系列步骤,那么这是最好的,同样/start.sh应该保持运行.

注意

对于初学者使用supervisord不建议使用.老实说,这太过分了.对容器使用单个服务/单个命令要好得多.

顺便说一下:请查看https://registry.hub.docker.com了解现有的mysql docker图片以供参考

  • @KarlMorrison`docker exec -it <CONTAINER NAME> mysql /etc/init.d/mysqld restart (3认同)

Jia*_*Jia 70

在你的Dockerfile,在最后一行添加

ENTRYPOINT service ssh restart && bash
Run Code Online (Sandbox Code Playgroud)

这个对我有用

这就是结果:

root@ubuntu:/home/vagrant/docker/add# docker run -i -t ubuntu
 * Restarting OpenBSD Secure Shell server sshd   [ OK ]                                                                      
root@dccc354e422e:~# service ssh status
 * sshd is running
Run Code Online (Sandbox Code Playgroud)

  • 它使用docker run -i -t -d工作正常 (4认同)
  • 当你想优雅地停止你的服务时,最后启动 Bash 是一个坏主意,因为这样docker contaienr 不能被`docker stop` 或`docker restart` 优雅地停止,只能被杀死。 (3认同)
  • 这很好,但我认为你不能这样一个分离的容器. (2认同)

Fra*_*ula 7

还有另一种方法,我总是发现它更具可读性.

假设您在运行时想要启动rabbitmq和mongodb,那么您CMD将看起来像这样:

CMD /etc/init.d/rabbitmq-server start && \
    /etc/init.d/mongod start
Run Code Online (Sandbox Code Playgroud)

因为CMD每个Dockerfile技巧只能有一个是连接所有指令,&&然后\用于每个命令以开始一个新行.

如果您最终添加到其中的许多内容中,我建议您将所有命令放在脚本文件中,并像@ larry-cai建议的那样启动它:

CMD /start.sh
Run Code Online (Sandbox Code Playgroud)


use*_*309 7

这不起作用CMD service mysql start && /bin/bash

这不起作用CMD service mysql start ; /bin/bash ;

-- 我猜交互模式不支持前台。

这有效! CMD service nginx start ; while true ; do sleep 100; done;

这有效! CMD service nginx start && tail -F /var/log/nginx/access.log

请注意,您应该在没有命令参数的情况下使用docker run -p 80:80 nginx_bash


小智 6

简单!在dockerfile的末尾添加:

ENTRYPOINT service mysql start && /bin/bash
Run Code Online (Sandbox Code Playgroud)


Mr.*_*ter 5

就我而言,我有一个 PHP Web 应用程序由 Apache2 在连接到 MYSQL 后端数据库的 docker 容器中提供服务。Larry Cai 的解决方案只需稍作修改即可工作。我创建了一个entrypoint.sh文件,在其中管理我的服务。我认为entrypoint.sh在容器启动时要执行多个命令时创建一个是引导 docker 的更简洁的方法。

#!/bin/sh

set -e

echo "Starting the mysql daemon"
service mysql start

echo "navigating to volume /var/www"
cd /var/www
echo "Creating soft link"
ln -s /opt/mysite mysite

a2enmod headers
service apache2 restart

a2ensite mysite.conf
a2dissite 000-default.conf
service apache2 reload

if [ -z "$1" ]
then
    exec "/usr/sbin/apache2 -D -foreground"
else
    exec "$1"
fi
Run Code Online (Sandbox Code Playgroud)


小智 5

我将以下代码添加到 /root/.bashrc 以仅运行该代码一次,

请在运行此脚本之前将容器提交到映像,否则将在映像中创建“docker_services”文件并且不会运行任何服务。

if [ ! -e /var/run/docker_services ]; then
    echo "Starting services"
    service mysql start
    service ssh start
    service nginx start
    touch /var/run/docker_services
fi
Run Code Online (Sandbox Code Playgroud)


Wei*_*hen 5

当我想自动启动 ssh 服务时,我也遇到同样的问题。我发现附加

/etc/init.d/ssh启动
~/.bashrc
可以解决它,但只有你用bash打开它才可以。