【问题标题】:docker build does not sustain processesdocker build 不支持进程
【发布时间】:2015-09-15 08:47:29
【问题描述】:

所以这可能是我的 Dockerfile:

FROM ubuntu:latest
RUN apt-get -y update && apt-get install -y mysql-server-5.6
RUN service mysql start
RUN service mysql status

它在构建过程中抛出一个错误,表明 MySQL 没有运行,即使前面的命令成功完成。守护进程似乎无法在 Dockerfile 中的不同命令之间运行。

这是一个人为的例子,但在我真正的 Dockerfile 中,我有配置数据库的行,它们需要在后台运行一个守护程序。我发现解决这个问题的唯一解决方案是运行:

RUN service mysql start && ./database_configure1.sh
RUN service mysql start && ./do_something_else_with_db.sh
and so on

但这可能不是这样做的方法。有没有更好的方法来解决这个问题?

【问题讨论】:

    标签: service build docker daemon


    【解决方案1】:

    Dockerfile 中的每个RUN 命令都在不同的容器 中运行,因此这是实际的事件顺序:

    • service mysql start 启动 MySQL。
    • 然后容器停止(MySQL 停止)。
    • 然后拍摄快照。
    • 然后使用该快照启动一个新容器。
    • service mysql status 在新容器中运行。

    当然,mysql 实际上并没有在后一个容器中运行,所以它失败了。


    因此,您需要在一个构建步骤中完成所有操作。通常,您需要通过在容器中运行 shell 脚本来执行此操作。

    来了。

    您的目录树应如下所示:

    Dockerfile
    do_stuff_with_mysql.sh
    

    然后,在您的 Dockerfile 中,执行:

    ADD do_stuff_with_mysql.sh /
    RUN chmod 755 /do_stuff_with_mysql.sh
    RUN do_stuff_with_mysql.sh
    

    而且,在do_stuff_with_mysql.sh 中,您应该有如下所示的内容:

    #!/bin/bash
    set -o errexit
    set -o nounset
    
    service mysql start 
    ./database_configure1.sh
    ./do_something_else_with_db.sh
    service mysql stop
    # you should loop on `service mysql status` to confirm MySQL is done shutting down
    

    【讨论】:

    • 我希望我遗漏了一些东西,并且有一些很好的方法可以解决这个问题,但是这个解决方案仍然比我的更优雅:)
    猜你喜欢
    • 2021-01-28
    • 1970-01-01
    • 2020-01-10
    • 2016-07-29
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 2016-12-30
    • 2018-09-22
    相关资源
    最近更新 更多