如何在运行docker容器时自动启动一个服务?
如何在运行docker容器时自动启动一个服务?
我有一个用于在容器中安装MySQL服务器的Dockerfile,我用以下命令启动它:
sudo docker run -t -i 09d18b9a12be /bin/bash
但是MySQL服务不会自动启动,我必须手动在容器内运行以下命令:
service mysql start
当我运行docker容器时,如何自动启动MySQL服务?
在Docker容器中运行服务时,如何自动启动服务?
问题的原因:
- 需要在Docker容器启动时自动启动服务
- 之前尝试的方法无法实现自动启动服务
解决方法:
1. 在Dockerfile中的最后一行添加以下代码:
ENTRYPOINT service ssh restart && bash
2. 运行Docker容器:
docker run -i -t ubuntu
3. 检查服务状态:
service ssh status
这种方法可以实现自动启动服务,但无法在后台运行容器。
另外,还可以尝试以下方法来解决自动启动服务的问题:
- 添加以下代码到Dockerfile中:
RUN echo "daemon off;" >> /etc/nginx/nginx.conf RUN ln -sf /dev/stdout /var/log/nginx/access.log RUN ln -sf /dev/stderr /var/log/nginx/error.log
- 注意,使用"bash"作为最后的命令可能会导致无法通过docker stop或docker restart优雅地停止容器,建议使用其他命令替代,如"tail -f /var/log/mysql/error.log"。
以上是解决自动启动服务问题的方法,可以根据具体情况选择适合的解决方案。
在运行Docker容器时,自动启动服务的问题出现的原因是Docker镜像不保存正在运行的进程。因此,在Dockerfile中使用的RUN命令只会在构建过程中执行,并在构建完成后停止。解决方法是在容器启动时使用CMD或ENTRYPOINT命令指定要执行的命令。
解决方法有三种常见的方式来保持进程运行:
1. 使用service命令,并在其后附加非终止命令,如tail -F命令。
CMD service mysql start && tail -F /var/log/mysql/error.log
2. 使用前台命令来实现。
CMD /usr/bin/mysqld_safe
3. 将脚本包装成start.sh,并将其放在末尾。
CMD /start.sh
需要注意的是,对于初学者来说,不推荐使用supervisord。最好为容器使用单个服务或单个命令。
当服务在Docker容器中启动后,如何重新启动服务?
docker exec -it
不推荐使用tail命令来判断MySQL是否正在运行。在大多数mysqld设置中,服务器将从一些错误中恢复,并在此过程中关闭并重新打开错误日志。并且无法确定tail -F命令是否在所有情况下都适用。
不知道为什么,但第一种解决方案选项对于service脚本运行正常。如果不使用tail命令,则会失败,即使服务已启动(至少对于tomcat7服务而言)。使用tail命令就可以正常工作。对于这两种情况,您需要使用cap_add开关(--cap-add SYS_PTRACE)以及至少SYS_PTRACE。
registry.hub.docker.com将被重定向到hub.docker.com,该页面上没有相关信息。
所以,当运行Docker容器时,通过systemctl注册的常规服务不会运行。
不,更多信息请参考stackoverflow.com/questions/46800594/…
最好的答案,帮助我节省了购买Udemy课程的费用。