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 является избыточным.

Другие вопросы по тегам