ruby-on-rails - 使用docker-compose对Rails应用程序进行Docker化

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

嗨,我正在尝试使我的应用程序适应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的新手,所以建议会很受欢迎

    最佳答案

    您是DATABASE_URL,不能是localhost,它必须是服务名称。还需要在其中输入用户名和密码:

    postgres://postgres:postgres@postgres/postgres
    

    它使用默认值,因此无需发布。以下是URL的示例:https://stackoverflow.com/a/20722229/749924

    关于ruby-on-rails - 使用docker-compose对Rails应用程序进行Docker化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47435589/

    相关文章:

    ruby-on-rails - 如何在 Prawn 中居中 table ?

    Laravel docker cron nginx 502 错误网关问题 (111 : Connection refused) while connecting to upstream)

    docker - Kubernetes docker 容器中的前端 Vue.js 应用程序无法连接到后端

    linux - 如何在网络中公开?

    docker - 在两个容器之间共享文件

    ruby-on-rails - 当前页面?方法

    ruby-on-rails - rails 3 : How to add a method to the Gem model without changing the Gem source

    ruby-on-rails - 在 Rails 中,当资源创建操作失败并调用渲染 :new, 时,为什么 URL 必须更改为资源的索引 url?

    linux - Chef 服务器卡在 Docker 容器上运行的 ruby​​_block [supervise_rabbitmq_sleep] 操作

    mysql - 无法通过套接字连接到本地 MySQL 服务器 '/var/run/mysqld/mysqld.sock