【问题标题】:docker interactive mode exits after ENTRYPOINTdocker 交互模式在 ENTRYPOINT 后退出
【发布时间】:2016-10-05 01:28:03
【问题描述】:

给定以下 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但保持交互模式?

【问题讨论】:

    标签: docker


    【解决方案1】:

    ubuntu 12.04 into docker “service mysql start”

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

    您可以运行两个容器并在它们之间创建一个网络。一个用于 mysql,另一个用于 pythonapp。这是在两个容器之间创建网络的方法

    docker network create <network_name>
    

    使用--net=&lt;network_name&gt;启动容器将容器附加到新网络

    docker run -d --net=anetwork --name=mysql -e MYSQL_USER=ROOT -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql
    
    docker run --net=anetwork --name=pythonapp -it python:2.7-wheezy bash
    

    我认为您对ENTRYPOINTCMD 感到困惑。要理解的关键点是ENTRYPOINT 将始终在启动映像时运行,即使向 docker run 调用提供了命令。如果您尝试提供命令,它将作为参数添加到 ENTRYPOINT,替换 CMD 指令中定义的默认值。如果您明确地将 --entrypoint 标志传递给 docker run 命令,则只能覆盖 ENTRYPOINT

    这意味着用/bin/bash 命令运行镜像不会给你一个shell;而是将/bin/bash 作为参数提供给service mysql start

    Network between container ubuntu 12.04 into docker “service mysql start”

    Difference Between CMD and ENTRYPOINT in Dockerfile

    【讨论】:

      【解决方案2】:

      您的 ENTRYPOINT / CMD 指令需要是一个长时间运行的命令。 service mysql start 不是一个连续的命令,因为它在 Ubuntu 中运行,服务本身,然后命令退出。

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

      【讨论】:

      • 但是为什么忽略它是一种交互模式呢?
      • 因为你正在运行一个运行和停止的入口点命令。
      • 所以你是说入口点在交互模式下不能很好地工作?
      • 我不是。看看这个答案:stackoverflow.com/questions/21553353/…。总结起来很糟糕,CMDENTRYPOINT 命令将运行该命令并退出。因此,如果您的入口点是 ENTRYPOINT ls -l /usr/bin 并且您运行一个交互式容器,您将获得 /usr/bin 文件夹的输出和硬退出。出于同样的原因,您会从service mysql start 硬退出 - 此命令在 Mysql 在后台运行时运行并退出。 Docker CMDENTRYPOINT 命令需要持久化。
      • 另一方面,mysqld 在前台运行服务并持续存在,因此它在失败之前永远不会存在,从而使您的容器保持活动状态。
      猜你喜欢
      • 1970-01-01
      • 2018-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多