【问题标题】:Dockerizing a Rails application with docker-compose使用 docker-compose 对 Rails 应用程序进行 Dockerizing
【发布时间】:2017-11-22 13:10:23
【问题描述】:

您好,我正在尝试使我的应用程序适应 docker。

我的应用堆栈是

  • Ruby 2.4.0
  • Rails 5.0.1
  • Postgres 9.5.8

我创建了一个Dockerfile 来创建my-app 的图像

FROM ruby:2.4

RUN apt-get update && apt-get install -y \
    software-properties-common \
    python-software-properties \
    build-essential \
    libpq-dev \
    libxml2-dev libxslt1-dev \
    libqt4-webkit libqt4-dev xvfb \
    nodejs \
    postgresql

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY Gemfile /usr/src/app
COPY Gemfile.lock /usr/src/app
RUN bundle install
ADD . /usr/src/app
COPY ./docker/docker-entrypoint.sh /usr/src/app/docker-entrypoint.sh
RUN chmod +x /usr/src/app/docker-entrypoint.sh
RUN bundle install

然后我创建了一个docker-compose.yml

version: '3'
services:

  app:
    image: app_rails
    entrypoint: ['/usr/src/app/docker-entrypoint.sh']
    ports:
      - "3000:3000"
    depends_on:
      - postgres
    links:
      - postgres
    volumes:
      - .:/usr/src/app
    environment:
      DATABASE_URL: postgres://postgres@postgres@postgres:5432/postgres?pool=5&encoding=utf-8

  postgres:
    image: postgres:9.5.8
    ports:
     - "5432:5432"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: postgres

这里是脚本docker-entrypoint.sh

#!/bin/sh
set -e

host="$1"
echo "host: ${host}"

if [ "$#" -gt 0 ]; then shift; fi

until psql -h "$host" -U "postgres" -c '\q'; do
  >&2 echo "Postgres is unavailable - sleeping"
  sleep 1
done

rails db:create
rails db:migrate RAILS_ENV=development

bundle exec rails server -b 0.0.0.0

exec "$@"

还有我的database.yml

# SQLite version 3.x
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
#
default: &default
  adapter: postgresql
  pool: 5
  timeout: 5000

development:
  adapter: postgresql
  database: app_development
  pool: 5
  timeout: 5000
  url: postgres://postgres@postgres/postgres:5432

test:
  adapter: postgresql
  database: app_test
  pool: 5
  timeout: 5000

production:
  adapter: postgresql
  database: app_production
  pool: 5
  timeout: 5000

我在运行脚本时遇到问题

web_1       |   connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
web_1       | Postgres is unavailable - sleeping

由于我是 docker 新手,欢迎提出建议

【问题讨论】:

    标签: ruby-on-rails docker docker-compose dockerfile


    【解决方案1】:

    你的 DATABASE_URL 不能是 localhost,它必须是服务的名称。它还需要用户名和密码:

    postgres://postgres:postgres@postgres/postgres
    

    它不需要post,因为它使用默认值。以下是 URL 的示例:https://stackoverflow.com/a/20722229/749924

    【讨论】:

    • @Bret_Fisher 谢谢你的回答。继续工作非常有帮助。抱歉,我完全更新了问题,但是自从您的回答以来,我一直在努力使其工作,但我有点卡住了。 PS。我认为你在 coursera 中的课程是我上过的最好的课程之一
    • 我更正了我的答案我有:和@向后:P
    • 提示:可能与您的失败无关,但理想情况下,您希望您的 ENTRYPOINT 仅执行等待和 db 迁移步骤,然后将 CMD 添加到 bundle exec rails server -b 0.0.0.0 的 Dockerfile,以便正确启动服务器。
    【解决方案2】:

    试试

    chmod +x /usr/src/my-app/docker-entrypoint.sh
    

    确保您的入口点是可执行文件

    【讨论】:

    • 谢谢你的回答我已经在 Dockerfile 中执行了
    • 你运行 docker-compose 作为 sudo 吗?并在构建映像之前制作 chmod +x docker-entrypoint.sh
    • 谢谢,现在它改变了输出(我没有用sudo执行)我写它作为问题的更新
    • 对不起,我完全更新了问题,但我正在工作,我卡住了,但现在不同了。您的回答帮助我了解了另一点。
    猜你喜欢
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 2019-06-08
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多