docker-compose:运行rails db:setup和rake任务以初始化数据

时间:2018-06-19 14:02:48

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

我找不到从docker-compose.yml文件执行以下命令的方式:

  • rails db:setup
  • rails db:init_data

我尝试按照以下步骤进行操作,但失败了:

version: '3'

services:
  web:
    build: .
    links:
      - database
      - redis
    ports:
      - "3000:3000"
    volumes:
      - .:/usr/src/app
    env_file:
      - .env/development/database
      - .env/development/web
    command: ["rails", "db:setup"]
    command: ["rails", "db:init_data"]
  redis:
    image: redis
  database:
    image: postgres
    env_file:
      - .env/development/database
    volumes:
      - db-data:/var/lib/postgresql/data
volumes:
  db-data:

关于这里出了什么问题的任何主意吗?谢谢。 代码源位于GitHub上。

2 个答案:

答案 0 :(得分:0)

我认为您可以做两件事:

  1. Locals Dam 112 8.73 113 4.496 114 0.666 115 0 116 2.865 117 -3.008 118 1.998 119 -12.78 更改为以下行,因为在撰写文件中不允许使用两个命令:
    command: 
      - /bin/bash
      - -c 
      - |
          rails db:setup
          rails db:init_data

  1. 使用 supervisord 应用程序:supervisord web page

答案 1 :(得分:0)

对我有用的解决方案是从CMD中删除Dockerfile,因为在command中使用docker-compose.yml选项会覆盖CMD命令。 因此,Docker文件将如下所示:

FROM ruby:2.5.1

LABEL maintainer="DECATHLON"

RUN apt-get update -yqq
RUN apt-get install -yqq --no-install-recommends nodejs

COPY Gemfile* /usr/src/app/
WORKDIR /usr/src/app
RUN bundle install

COPY . /usr/src/app/

然后将command选项添加到docker-compose文件中:

version: '3'

services:
  web:
    build: .
    links:
      - database
      - redis
    ports:
      - "3000:3000"
    volumes:
      - .:/usr/src/app
    env_file:
      - .env/development/database
      - .env/development/web
    command:
      - |
        rails db:reset
        rails db:init_data
        rails s -p 3000 -b '0.0.0.0'
  redis:
    image: redis
  database:
    image: postgres
    env_file:
      - .env/development/database
    volumes:
      - db-data:/var/lib/postgresql/data
volumes:
  db-data:

如果上述解决方案不适用于某人,则有另一种解决方案:

在项目路径中创建一个shell脚本并将其命名为entrypoint.sh,例如:

#!/bin/bash  
set -e  
bundle exec rails db:reset
bundle exec rails db:migrate  
exec "$@"

entrypoint文件中声明dpcker-compose选项:

v

version: '3'

services:
  web:
    build: .
    entrypoint:
      - /bin/sh
      - ./entrypoint.sh
    depends_on:
      - database
      - redis
    ports:
      - "3000:3000"
    volumes:
      - .:/usr/src/app
    env_file:
      - .env/development/database
      - .env/development/web
    command: ['./wait-for-it.sh', 'database:5432', '--', 'bundle', 'exec', 'rails', 's', '-p', '3000', '-b', '0.0.0.0']
  database:
    image: postgres:9.6
    env_file:
      - .env/development/database
    volumes:
      - db-data:/var/lib/postgresql/data
volumes:
  db-data:

我还使用wait-for-it脚本来确保数据库已启动。

希望这会有所帮助。我将修改推送到Github存储库。抱歉,代码块之前的文本中还有一些多余的字母,由于某些未知原因,代码降价功能无法正常工作,所以我让他们让它正常工作。