ste*_*eve 1 mysql debian ruby-on-rails docker
我一直在努力在一个容器中设置一个独立的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
Run Code Online (Sandbox Code Playgroud)
我需要在Dockerfile中做些不同的事情吗?为什么mysql在运行时不启动?
我的直觉说,如果在构建过程中启动了mysql,则它应该在运行时可用
这是不正确的。Docker将为您启动该服务并执行您在同一RUN命令中定义的后续步骤,但随后它将所有内容捆绑到一个中间映像中,以供后续命令使用。该映像没有正在运行的进程的已知状态,只有启动所需的任何内容(例如init.d脚本)。
您的解决方案是使用服务器启动脚本或mysqld_safe像在CMD生产线中一样继续调用。
一个好主意是使用supervisord非守护程序模式维护所有服务。Phusion还提供了带有runit初始化程序脚本的漂亮基础映像。
最终,您将看到Docker的功能在于如何真正将MySQL从Rails应用程序容器中分解出来并在链接在一起的完全不同的容器中运行它。