在 Docker 中运行 Rails 应用程序时,纱线包已过期

Posted

技术标签:

【中文标题】在 Docker 中运行 Rails 应用程序时,纱线包已过期【英文标题】:Yarn packages out of date when running Rails app in Docker 【发布时间】:2020-03-14 23:10:46 【问题描述】:

我将我的 Rails 6 应用程序作为 Docker 容器启动,但是当它启动 Rails 服务器时,它不断给出错误:

warning Integrity check: System parameters don't match
website_1   | error Integrity check failed
website_1   | error Found 1 errors.
website_1   |
website_1   |
website_1   | ========================================
website_1   |   Your Yarn packages are out of date!
website_1   |   Please run `yarn install --check-files` to update.
website_1   | ========================================
website_1   |
website_1   |
website_1   | To disable this check, please change `check_yarn_integrity`
website_1   | to `false` in your webpacker config file (config/webpacker.yml).

那么为什么这不起作用?我在 Dockerfile 中有该命令,并且在 webpacker.yml 中禁用了该检查。

我用docker-compose up --build 构建它,然后它似乎没有给出错误。 当我用docker-compose up 启动它时,它会在Rails 服务器启动时返回错误。以下是相关文件:

Dockerfile:

FROM ruby:2.6.5-slim

LABEL maintainer="John van Arkelen <johnvanarkelen@fastmail.com>"

RUN apt-get update -qq && apt-get install -y curl build-essential libpq-dev postgresql postgresql-contrib

RUN mkdir /app
RUN mkdir -p /usr/local/nvm
WORKDIR /app

RUN curl -sL https://deb.nodesource.com/setup_11.x | bash -
RUN apt-get install -y nodejs
RUN node -v
RUN npm -v

ENV BUNDLE_PATH /gems

RUN gem install bundler -v 2.0.2

COPY Gemfile Gemfile.lock package.json yarn.lock ./

RUN bundle install

RUN npm install -g yarn

COPY . /app

RUN yarn install --check-files

webpacker.yml:

default: &default
  source_path: app/javascript
  source_entry_path: packs
  public_root_path: public
  public_output_path: packs
  cache_path: tmp/cache/webpacker
  check_yarn_integrity: false
  webpack_compile_output: false

docker-compose.yml:

version: '2'

services:
  postgres:
    image: 'postgres:10.3-alpine'
    volumes:
      - 'postgres:/var/lib/postgresql/data'
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password123
      POSTGRES_DB: qd_development
    env_file:
      - '.env'

  redis:
    image: 'redis:4.0-alpine'
    command: redis-server --requirepass password123
    volumes:
      - 'redis:/data'

  website:
    depends_on:
      - 'postgres'
      - 'redis'
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    ports:
      - '3000:3000'
    volumes:
      - '.:/app'
      - gem_cache:/gems
    environment:
      DATABASE_HOST: postgres
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password123
      POSTGRES_DB: qd_development
    env_file:
      - '.env'

volumes:
  redis:
  postgres:
  gem_cache:




【问题讨论】:

【参考方案1】:

在我看来,您正在 /app 目录中的映像中正确构建您的应用程序。但是之后在您的 docker-compose 中,您在构建的 /app 目录上安装了一个本地卷,从而丢失了构建的 /app 文件夹内容。 尝试删除已挂载的卷 '.:/app'

【讨论】:

那么当您在开发过程中编辑文件时,这些更改是如何进入您的容器的?你每次都重建镜像吗? 是的,如果您选择将源文件放入映像中。 Docker 的缓存与良好的 Dockerfile 相结合,将确保只执行必要的构建步骤。 (首先复制 package.json 和 lock 文件并在添加其余源代码之前安装它通常是最大的快速胜利。)【参考方案2】:

在您的 docker-compose.yml 中,您也可以这样做以避免每次都重新构建。然后,你就可以docker-compose up

command: bash -c "bundle install && yarn install --check-files && bundle exec rails s -p 3000 -b '0.0.0.0'"

【讨论】:

我非常喜欢@sybind 的解决方案,因为它允许开发人员更新他们的本地并查看容器中的这些更改。

以上是关于在 Docker 中运行 Rails 应用程序时,纱线包已过期的主要内容,如果未能解决你的问题,请参考以下文章

使用 Intellij/Rubymine 在 docker 中调试 rails 应用程序

在 Rails Docker 容器中捆绑安装失败

带有 Docker 的 Rails '在任何资源中都找不到 ...' 用于现有的 gem

Rails不会替换database.yml中ENV的值

使用Docker和Jenkins运行测试 - 测试结果

Docker + Rails + MySQL =忽略database.yml中的环境变量