使用Docker构建Rails 6环境

首先

我打算使用Docker来构建Rails的开发环境。

前提 tí)

Ruby 3.0.6
Rails 6.1.0
Node 14.x

Ruby 3.0.6、Rails 6.1.0、Node 14.x

创建一个新的Rails应用

首先,建立好Ruby的环境,然后安装Rails。

FROM ruby:3.0.6

RUN apt-get update -qq && apt-get install -y nodejs postgresql-client

WORKDIR /myapp
version: '3'
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
  web:
    build: .
    command: bash
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

如果可以创建此文件,则执行以下命令进入容器内部。

docker-compose exec web

在容器中安装Rails。

gem install -v 6.1.0 rails

在这里,我们正在安装指定版本为6.1.0的软件。
安装完成后,让我们创建一个指定版本为6.1.0的Rails应用程序。

rails _6.1.0_  new . --database=postgresql

如果执行上述命令可能会显示以下错误消息,稍后会进行处理。

Yarn not installed. Please download and install Yarn from https://yarnpkg.com/lang/en/docs/install/

由于我们也能够创建Rails应用程序,所以我们将更新Dockerfile和docker-compose.yml。

FROM ruby:3.0.6

RUN apt-get update -qq && apt-get install -y nodejs postgresql-client

WORKDIR /myapp

COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock

RUN bundle install

EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]
version: '3'
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

前端

我将解决之前出现的yarn未安装的问题。
另外,在Rails 6中,如果Node的版本过新,可能无法正常运行,因此建议安装版本14系列。

FROM ruby:3.0.6

RUN apt-get update -qq && apt-get install -y curl postgresql-client

RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - \
    && apt-get install -y nodejs \
    && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
    && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
    && apt-get update && apt-get install -y yarn

WORKDIR /myapp

COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock

RUN bundle install

EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]

更新Dockerfile后,执行构建命令并向容器中添加yarn工具。

docker-compose build

如果能够添加yarn,我会在rails中添加webpacker。

docker-compose run web rails webpacker:install

数据库

接下来是关于数据库设置的部分。
在database.yml和docker-compose.yml中设定密码。

default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: password
  pool: 5

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  database: myapp_production
  username: postgres
  password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>
version: '3'
services:
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: password
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

如果構建容器,就能创建rails的数据库。

docker-compose run web rails db:create

微调整

也许只是我的环境出了问题,但我计划处理一下,因为在使用webpacker编译时出现了错误。

这是最初出现的错误。

Error: Cannot find package '@babel/plugin-proposal-private-methods' imported from /myapp/babel-virtual-resolve-base.js

我们可以按照错误信息的指示安装缺少的软件包。

docker-compose run web yarn add @babel/plugin-proposal-private-methods

下面是接下来发生的错误。

Error: [BABEL]: --- PLACEHOLDER PACKAGE ---
This @babel/plugin-proposal-private-property-in-object version is not meant to
be imported. Something is importing
@babel/plugin-proposal-private-property-in-object without declaring it in its
dependencies (or devDependencies) in the package.json file.
Add "@babel/plugin-proposal-private-property-in-object" to your devDependencies
to work around this error. This will make this message go away

我将根据错误消息在开发环境中安装所需的软件包。

docker-compose run web yarn --dev add @babel/plugin-proposal-private-property-in-object

通过执行以上两步处理,我成功解决了与webpacker相关的错误。我能够通过启动容器来查看Rails界面。

undefined
bannerAds