Docker Compose, Rails и Webpacker не сохраняют node_modules
TL;DR - yarn install устанавливает 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
Когда запускается установка пряжи, она устанавливает пакеты, после чего сразу же
Removing intermediate container 67bcd62926d2
За пределами контейнера при запуске ls node_modules отображается пустой каталог, и процесс docker-compose up в конечном итоге завершится неудачно, когда выполняется выход webpack_dev_server из-за отсутствия модулей.
Я сделал разные вещи, добавив node_modules как том в docker-compose.yml, но безрезультатно.
Единственное, что сработало в HAS, - это запуск локальной установки yarn для создания каталога, а затем повторение в каталоге, но затем у меня есть версии пакетов для OS X, которые могут в конечном итоге вызвать проблему.
Что я здесь не так делаю?
докер-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"
3 ответа
Последний шаг заключается в 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
У меня есть приложение 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 является избыточным.