docker交互模式在入口点后退出

docker交互模式在入口点后退出,docker,Docker,给定以下Dockerfile: From python:2.7-wheezy RUN apt-get update && apt-get upgrade --assume-yes RUN apt-get install mysql-server --assume-yes ENTRYPOINT service mysql start 当我运行docker时,它会在启动mysql服务器后立即退出: Jamess-iMac:docker-python-test jameslin$ d

给定以下Dockerfile:

From python:2.7-wheezy
RUN apt-get update && apt-get upgrade --assume-yes
RUN apt-get install mysql-server --assume-yes
ENTRYPOINT service mysql start
当我运行docker时,它会在启动mysql服务器后立即退出:

Jamess-iMac:docker-python-test jameslin$ docker run -i -t 9618f71f65e4 /bin/bash
[ ok ] Starting MySQL database server: mysqld ..
[info] Checking for tables which need an upgrade, are corrupt or were 
not closed cleanly..
Jamess-iMac:docker-python-test jameslin$ 

如何使其自动启动mysql,但保持在交互模式?

您的
入口点
/
CMD
指令需要是一个长时间运行的命令<代码>服务mysql start不是一个连续的命令,因为它在Ubuntu中运行,服务本身运行,然后命令退出


为了简单起见,如果你只是想运行一个mysql容器,你可以运行
docker-run-mysql
。如果您确实需要运行一个一次性的mysql容器,您可以使用默认mysql容器从这里开始的方式:-
CMD[“mysqld”]
-这应该类似于您在
/etc/init.d/mysql
中看到的实际启动命令,您的
入口点
/
CMD
指令需要是一个长时间运行的命令<代码>服务mysql start不是一个连续的命令,因为它在Ubuntu中运行,服务本身运行,然后命令退出

为了简单起见,如果你只是想运行一个mysql容器,你可以运行
docker-run-mysql
。如果您确实需要运行一个一次性的mysql容器,您可以使用默认的mysql容器在这里开始的方式:-
CMD[“mysqld”]
-这应该类似于您在
/etc/init.d/mysql
中看到的实际启动命令

如果您阅读上面的线程,您可以看到,
Docker
没有任何运行级别,因此mysql不知道它应该何时启动

您可以运行两个容器并在它们之间创建一个网络。一个用于mysql,另一个用于pythonapp。下面是如何在两个容器之间创建网络

docker network create <network_name>

我想你把
ENTRYPOINT
CMD
搞混了。要理解的关键点是,映像启动时,
ENTRYPOINT
将始终运行,即使向docker run调用提供了命令。如果您试图提供命令,它会将该命令作为参数添加到
入口点
,替换CMD指令中定义的默认值。只有将
--ENTRYPOINT
标志显式传递给docker run命令,才能覆盖
入口点

这意味着使用
/bin/bash
命令运行映像不会给您一个shell;相反,它将提供
/bin/bash
作为
服务mysql start
的参数

如果您阅读上面的线程,您可以看到,
Docker
没有任何运行级别,因此mysql不知道它应该何时启动

您可以运行两个容器并在它们之间创建一个网络。一个用于mysql,另一个用于pythonapp。下面是如何在两个容器之间创建网络

docker network create <network_name>

我想你把
ENTRYPOINT
CMD
搞混了。要理解的关键点是,映像启动时,
ENTRYPOINT
将始终运行,即使向docker run调用提供了命令。如果您试图提供命令,它会将该命令作为参数添加到
入口点
,替换CMD指令中定义的默认值。只有将
--ENTRYPOINT
标志显式传递给docker run命令,才能覆盖
入口点

这意味着使用
/bin/bash
命令运行映像不会给您一个shell;相反,它将提供
/bin/bash
作为
服务mysql start
的参数


但为什么它会忽略它是一种交互模式?因为您正在运行一个entrypoint命令,该命令会运行并停止。那么您是说entrypoint与交互模式不兼容?我不是。请查看以下答案:。总结起来很糟糕,一个
CMD
ENTRYPOINT
命令将运行该命令并退出。因此,如果您的入口点是
entrypoint ls-l/usr/bin
,并且您运行一个交互式容器,您将得到
/usr/bin
文件夹的输出和一个硬退出。出于同样的原因,您将从
服务mysql start
中获得一个硬退出-当mysql在后台运行时,此命令运行并退出。Docker
CMD
ENTRYPOINT
命令需要持久化。另一方面,
mysqld
在前台运行服务并持久化,因此它在出现故障之前从不存在,但是为什么它会忽略它是一种交互模式呢?因为你正在运行一个entrypoint命令,该命令会运行并停止。那么你是说entrypoint在交互模式下工作不好吗?我不是。请查看以下答案:。总结起来很糟糕,一个
CMD
ENTRYPOINT
命令将运行该命令并退出。因此,如果您的入口点是
entrypoint ls-l/usr/bin
,并且您运行一个交互式容器,您将得到
/usr/bin
文件夹的输出和一个硬退出。出于同样的原因,您将从
服务mysql start
中获得一个硬退出-当mysql在后台运行时,此命令运行并退出。Docker
CMD
ENTRYPOINT
命令需要持久化。另一方面,
mysqld
在前台运行服务并持久化,因此它在出现故障之前从不存在,从而使容器保持活动状态。