【问题标题】:If a service is started during docker build, should it be running at runtime?如果在 docker build 期间启动了服务,它应该在运行时运行吗?
【发布时间】:2016-01-23 09:22:00
【问题描述】:

我一直致力于在单个容器中设置一个独立的 Rails 应用程序。这意味着在一个容器中同时运行 Rails 和数据持久性服务。在我们的例子中,这意味着 mysql。

但是,我遇到了多个问题,因为 mysql 没有运行。

在构建步骤期间,如果我有 RUN mysqld 和单独的 RUN rake db:create 步骤,rake 会崩溃,因为 mysql 已关闭。

所以我通过将两个命令包装到一个脚本中来解决这个问题。但是,在运行时,rails 将无法启动,因为 mysql 没有运行。

我的直觉说,如果在构建过程中启动了mysql,它应该在运行时可用,但我没有那种经验。启动 Rails 服务器必须包含在另一个调用 mysqld 的脚本中。

这是 dockerfile:

FROM ruby:2.2
RUN mkdir -p $APPDIR
WORKDIR $APPDIR
ADD Gemfile* $APPDIR/
RUN bundle install
RUN apt-get update -qq
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y -qq nodejs mysql-server --no-install-recommends
RUN rm -rf /var/lib/apt/lists/* # */ broken syntax highlighting
COPY . $APPDIR
RUN script/mysql-setup.sh # contents are: mysqld_safe; rake db:create; rake db:migrate
EXPOSE 3000
CMD ["script/rails-launcher.sh"] # contents are: mysqld_safe; rails s

我需要在 Dockerfile 中做一些不同的事情吗?为什么mysql在运行时没有启动?

【问题讨论】:

  • 我在 dockerfile 中遗漏了一行:ENV APPDIR /usr/src/app

标签: mysql ruby-on-rails docker debian


【解决方案1】:

我的直觉说,如果在构建过程中启动了mysql,它应该在运行时可用

这是不正确的。 Docker 将为您启动服务并执行您在同一 RUN 命令中定义的后续步骤,但随后它将所有内容捆绑到一个中间映像中以供后续命令使用。该映像没有运行进程的已知状态,只有启动所需的任何状态,例如 init.d 脚本。

您的解决方案是use a server startup script 或继续调用mysqld_safe,就像您在CMD 行中所做的那样。

一个好主意是使用supervisord 以非守护程序模式维护您的所有服务。 Phusion also provides a nice base image 带有一个 runit 初始化脚本。

最终,您将看到 Docker 的强大之处在于如何将 MySQL 从 Rails 应用容器中分离出来并在链接在一起的 an entirely different container 中运行它。

【讨论】:

  • 我确实计划将持久性拆分到另一个容器中,但我想从自包含的所有内容开始。
  • 非常感谢!
【解决方案2】:

RUN 命令用于配置您的图像,每次调用它时,都会使用运行命令的结果创建一个新层。因此,如果您需要在映像构建步骤中配置数据库,您有两种解决方案:您可以在单个 RUN 调用中调用多个命令,例如

RUN /bin/bash -c  "mysqld_safe" && "rake db:create" && "rake db:migrate"

或者通过调用单个脚本,就像你做的那样。

在这两种情况下,您都必须了解,事实上,您在镜像构建期间运行了一些东西,它不会在容器启动时自动运行。因此,您必须在容器启动时手动启动数据库服务器。

【讨论】:

    猜你喜欢
    • 2019-10-02
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多