Docker Compose、Rails 和 Webpacker 不保留 node_modules

问题描述 投票:0回答:3

TL;DR - 纱线安装将node_modules安装在“中间容器”中,并且包在构建步骤后消失。

我正在尝试让 webpacker 与我们的 dockerized Rails 5.0 应用程序一起使用。

Dockerfile

FROM our_company_centos_image:latest
RUN yum install wget -y
RUN wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo
RUN yum install sqlite-devel yarn -y
RUN mkdir -p $APP_HOME/node_modules
COPY Gemfile Gemfile.lock package.json yarn.lock $APP_HOME/
RUN bundle install --path /bundle
RUN yarn install --pure-lockfile
ADD . $APP_HOME

当yarn install运行时,它会安装软件包,然后立即安装

Removing intermediate container 67bcd62926d2

在容器外部,运行 ls node_modules 显示一个空目录,并且当运行 webpack_dev_server 退出时,由于模块不存在,docker-compose up 进程最终将失败。

我已经做了很多事情,将 node_modules 添加为 docker-compose.yml 中的卷,但没有效果。

唯一有效的是在本地运行yarn install来构建目录,然后在目录中再次执行此操作,但是我得到了OS X版本的软件包,这最终可能会导致问题。

我在这里做错了什么?

docker-compose.yml

version: '2'
services:
  web:
    build: .
    network_mode: bridge
    environment:
      WEBPACK_DEV_SERVER_HOST: webpack_dev_server
    links:
      - webpack_dev_server
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - ./node_modules:/app/node_modules
      - .:/app
    ports:
      - "3000:3000"
    tty: true
    stdin_open: true
  webpack_dev_server:
    image: myapp_web
    network_mode: bridge
    command: bin/webpack-dev-server
    environment:
      NODE_ENV: development
      RAILS_ENV: development
      WEBPACK_DEV_SERVER_HOST: 0.0.0.0
    volumes:
      - .:/app
    ports:
      - "3035:3035"
docker docker-compose yarnpkg webpacker
3个回答
1
投票

最后一步是

ADD . $APP_HOME
。您还提到本地树中的
node_modules
文件夹为 。这是否意味着
node_modules
仍然作为空文件夹存在?

如果这是真的,那么

node_modules
空文件夹可能会在
ADD
步骤中被复制,并覆盖上一个
yarn
步骤中完成的所有内容。


0
投票

我发现的一个解决方案是将

node_modules
添加为体积。

例如,如果您

node_modules
目录位于
/usr/src/app/node_modules
,只需添加:

volumes:
- /usr/src/app/node_modules

-1
投票

我有一个带有 webpacker 的 Rails 5.2.0.rc1 应用程序,在 https://github.com/archonic/limestone 工作。虽然还不是 100% 正确,但我发现运行

docker-compose webpacker yarn install --pure-lockfile
可以在
docker-compose up --build
之前在新环境中启动并运行。我还不完全确定为什么需要这样做,因为它在 Dockerfile 中。

据我所知,您的网络卷应该只是

- '.:/app'
,并且带有node_modules的语句是多余的。

© www.soinside.com 2019 - 2024. All rights reserved.