【问题标题】:How to run rails app in docker container with nginx running on host machine?如何在主机上运行 nginx 的 docker 容器中运行 rails 应用程序?
【发布时间】:2017-07-08 17:31:48
【问题描述】:

我正在处理我需要的场景: 1. nginx在宿主机上运行 2. 在 docker 容器中运行的 rails 应用程序

我最初的工作包括将 Dockerfile 添加到主机上的 rails app 目录中,如下所示:

ubuntu@ubuntu-xenial:~/rails_docker$ cat Dockerfile
FROM ruby:2.1-onbuild

ENV HOME /home/rails/webapp

RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

WORKDIR $HOME

# Install gems
ADD Gemfile* $HOME/
RUN bundle install

# Add the app code
ADD . $HOME

EXPOSE 8080
EXPOSE 5432

由于我已经在主机上安装了 nginx,它被配置为查看主机上存在 rails 应用程序的目录:

ubuntu@ubuntu-xenial:~$ cat /etc/nginx/sites-available/www.testblog.io.conf
# MANAGED BY PUPPET
server {
  listen *:8080;
  server_name           www.testblog.io;

  index  index.html index.htm index.php;

  access_log            /var/log/nginx/www.testblog.io.access.log combined;
  error_log             /var/log/nginx/www.testblog.io.error.log;

  location / {
    root      /home/ubuntu/rails_docker/public;
    index     index.html index.htm index.php;
  }
  passenger_enabled on;
  passenger_ruby /usr/local/rvm/wrappers/default/ruby;
} 

我能够构建 docker 映像,我的下一个想法如下: 1.在运行“rails container”时将/home/ubuntu/rails_docker声明为主机卷 2. 公开8080:8080和5432:5432端口

我使用的命令如下:

ubuntu@ubuntu-xenial:~/rails_docker$ docker run -d -p 8080:8080 --name examplerails -v /home/ubuntu/rails_docker:/home/rails/webapp railsapptest
82c8aa45b8c1a405e198a565feabf105d1afcbb1c37f8b7b11bf764395ed8c4e

当我查看日志时:

ubuntu@ubuntu-xenial:~/rails_docker$ docker logs -f examplerails
Switch to inspect mode.

由于某种原因,它进入了 irb 模式。知道我做错了什么吗?

提前致谢, 巴基尔

【问题讨论】:

    标签: ruby-on-rails nginx docker


    【解决方案1】:

    您的 Dockerfile 中需要有一个 CMD 指令。这是启动 Docker 容器时运行的命令。如果您不指定命令,它将运行您的 FROM 图像使用的任何命令,如果您查看 the Ruby docker image,您可以看到它是 'irb'。

    您可以在the Docker documentation 中阅读有关 CMD 指令以及有关 Dockerfile 的所有其他内容的更多信息。

    【讨论】:

    • 感谢您的提示。那么我在 Dockerfile 中指定的 CMD 会覆盖上游映像中的 CMD 吗?但是,有没有办法让“容器活着”?具体来说,我不想在容器内运行任何特定的东西,所以我不需要使用 CMD,我只想在我的容器中复制 rails 应用程序并将它挂在运行本地机器的 nginx 上?
    • 是的,CMD 会覆盖上游镜像中的指令。抱歉,我不明白您所说的“容器活着”或将容器连接到 nginx 是什么意思。据我了解,如果不在容器中运行命令,您根本无法使用 Docker。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 2023-03-07
    相关资源
    最近更新 更多