gpt4 book ai didi

mysql - 如果在 docker build 期间启动服务,它应该在运行时运行吗?

转载 作者:行者123 更新时间:2023-11-29 04:06:44 25 4
gpt4 key购买 nike

我一直致力于在单个容器中设置独立的 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 在运行时没有启动?

最佳答案

My intuition says that if mysql is started during the build, it should be available at runtime

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

您的解决方案是 use a server startup script或者像在 CMD 行中一样继续调用 mysqld_safe

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

最终,您将了解 Docker 的强大之处在于如何真正将 MySQL 从 Rails 应用程序容器中分离出来并在 an entirely different container 中运行它。连在一起。

关于mysql - 如果在 docker build 期间启动服务,它应该在运行时运行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33309120/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com