docker构build不支持stream程

所以这可能是我的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 

它会在构build过程中抛出一个错误,即使上一个命令成功完成,MySQL仍未运行。 Deamons似乎不能在Dockerfile中的不同命令之间运行。

这是一个人为的例子,但在我真正的Dockerfile中,我有一些configuration数据库的行,他们需要在后台运行一个deamon。 解决这个问题的唯一方法就是运行:

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

但是,这可能不是这样做的。 有没有更好的方法去做这件事?

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

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

当然, mysql实际上并不在后面的容器中运行,所以失败了。


所以,相反,您需要在一个构build步骤中完成所有工作 。 通常情况下,您需要通过在容器中运行一个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