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"
最后一步是
ADD . $APP_HOME
。您还提到本地树中的 node_modules
文件夹为 空。这是否意味着 node_modules
仍然作为空文件夹存在?
如果这是真的,那么
node_modules
空文件夹可能会在 ADD
步骤中被复制,并覆盖上一个 yarn
步骤中完成的所有内容。
我发现的一个解决方案是将
node_modules
添加为体积。
例如,如果您
node_modules
目录位于 /usr/src/app/node_modules
,只需添加:
volumes:
- /usr/src/app/node_modules
我有一个带有 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的语句是多余的。