Проблема с node-sass и Docker

Я пытаюсь докеризировать свое приложение node. Мое текущее приложение — это экспресс-сервер nodejs с postgresql. ExpressJS использует node-sass-middleware для обработки ресурсов sass. Когда я запускаю node и postgresql локально на моем компьютере с OSX, все работает нормально. Когда я пытаюсь запустить приложение с помощью docker-compose, я получаю сообщение «Ошибка привязки».

Вот мой Dockerfile:

FROM node:7.2.1
RUN apt-get update -qq && apt-get install -y build-essential
RUN apt-get install -y libpq-dev postgresql-client
ENV APP_HOME /my_app
RUN mkdir $APP_HOME
WORKDIR $APP_HOME
ADD package.json .
RUN npm install
RUN npm rebuild node-sass
ADD . .
CMD [ "npm", "start" ]
EXPOSE 3000

Вот мой файл docker-compose.yml:

version: '2'
services:
    db:
      image: postgres:9.6.1
      ports:
        - '5432:5432'
    web:
      build: . # use the Dockerfile next to this file
      volumes:
        - .:/my_app
      ports:
        - "3000:3000"
      depends_on:
        - db

Когда я запускаю docker-compose up, я все еще получаю следующую ошибку:

web_1  | [nodemon] 1.11.0
web_1  | [nodemon] to restart at any time, enter `rs`
web_1  | [nodemon] watching: *.*
web_1  | [nodemon] starting `node ./bin/www`
web_1  | /my_app/node_modules/node-sass/lib/binding.js:15
web_1  |       throw new Error(errors.missingBinary());
web_1  |       ^
web_1  |
web_1  | Error: Missing binding /my_app/node_modules/node-sass/vendor/linux-x64-51/binding.node
web_1  | Node Sass could not find a binding for your current environment: Linux 64-bit with Node.js 7.x
web_1  |
web_1  | Found bindings for the following environments:
web_1  |   - OS X 64-bit with Node.js 7.x
web_1  |
web_1  | This usually happens because your environment has changed since running `npm install`.
web_1  | Run `npm rebuild node-sass` to build the binding for your current environment.
web_1  |     at module.exports (/my_app/node_modules/node-sass/lib/binding.js:15:13)
web_1  |     at Object.<anonymous> (/my_app/node_modules/node-sass/lib/index.js:14:35)
web_1  |     at Module._compile (module.js:571:32)
web_1  |     at Object.Module._extensions..js (module.js:580:10)
web_1  |     at Module.load (module.js:488:32)
web_1  |     at tryModuleLoad (module.js:447:12)
web_1  |     at Function.Module._load (module.js:439:3)
web_1  |     at Module.require (module.js:498:17)
web_1  |     at require (internal/module.js:20:19)
web_1  |     at Object.<anonymous> (/my_app/node_modules/node-sass-middleware/middleware.js:3:12)
web_1  |     at Module._compile (module.js:571:32)
web_1  |     at Object.Module._extensions..js (module.js:580:10)
web_1  |     at Module.load (module.js:488:32)
web_1  |     at tryModuleLoad (module.js:447:12)
web_1  |     at Function.Module._load (module.js:439:3)
web_1  |     at Module.require (module.js:498:17)
web_1  | [nodemon] app crashed - waiting for file changes before starting...

Я думал, что добавление RUN npm rebuild node-sass в Dockerfile создаст правильную привязку для ОС в контейнере докеров... Но, похоже, это не работает.

есть идеи?


person jubeless    schedule 30.01.2017    source источник
comment
Какую версию node-sass-middleware/node-sass вы пытаетесь установить. Поддержка Node 7 была добавлена ​​совсем недавно.   -  person nschonni    schedule 01.02.2017
comment
@nschonni я использую node-sass-middleware версии 0.9.8   -  person jubeless    schedule 02.02.2017


Ответы (4)


Поддержка Node.js 7 (для Linux и OSX), похоже, была добавлена ​​в node-sass v3.7.0. Убедитесь, что вы используете версию, равную или более новую, чем эта.

Либо вы можете обновить свой Dockerfile:

FROM node:7.2.1
RUN apt-get update -qq && apt-get install -y build-essential
RUN apt-get install -y libpq-dev postgresql-client
ENV APP_HOME /my_app
RUN mkdir $APP_HOME
WORKDIR $APP_HOME
ADD package.json .

# Add the two entries below
RUN mkdir -p node_modules/node-sass/vendor/linux-x64-51
RUN curl -L https://github.com/sass/node-sass/releases/download/v4.5.0/linux-x64-51_binding.node -o node_modules/node-sass/vendor/linux-x64-51/binding.node

RUN npm install
RUN npm rebuild node-sass
ADD . .
CMD [ "npm", "start" ]
EXPOSE 3000

Или вы можете загрузить привязку локально, а затем выполнить сборку из Dockerfile без каких-либо изменений:

cd /path/to/node_app/node_modules
mkdir -p node-sass/vendor/linux-x64-51
curl -L https://github.com/sass/node-sass/releases/download/v4.5.0/linux-x64-51_binding.node -o node-sass/vendor/linux-x64-51/binding.node

Следите за различными версиями предварительно скомпилированных нативных привязок по адресу: https://github.com/sass/node-sass/releases

person Nehal J Wani    schedule 30.01.2017
comment
Мне удалось получить файл привязки локально и создать его из Dockerfile, однако теперь я получаю новую ошибку: web_1 | Error: /my_app/node_modules/node-sass/vendor/linux-x64-51/binding.node: invalid ELF header Thoughts? - person jubeless; 31.01.2017
comment
Не тяните ничего из репозитория бинарных файлов, это просто блокнот для сопровождающих, который исчезнет. Если вы собираетесь закручивать двоичные файлы, используйте вложения релизов GH. - person nschonni; 01.02.2017
comment
Использование вложения релизов GH не решило проблему. Я все еще получаю сообщение об ошибке: Error: /my_app/node_modules/node-sass/vendor/linux-x64-51/binding.node: invalid ELF header - person jubeless; 02.02.2017
comment
Какую версию node-sass вы используете? - person Nehal J Wani; 02.02.2017
comment
Если вы используете Alpine, вам понадобится вариант Musl linux_musl-x64-51_binding.node. - person nschonni; 02.02.2017
comment
Я только что понял свою ошибку в ответе. Это должно было быть curl -L, а не просто curl. @jubeless Пожалуйста, попробуйте еще раз. @nschonni, образ докера для узла: 7.2.1 использует debian8. - person Nehal J Wani; 03.02.2017
comment
Не могли бы вы взглянуть на мой вопрос здесь, пожалуйста: stackoverflow.com/questions/60153462/ +1. - person w0051977; 10.02.2020

Я несколько раз сталкивался с этой проблемой при запуске своих приложений в Docker. Я считаю, что проблема возникает при монтировании моего локального каталога приложений с помощью Docker, поскольку он включает папку node_modules, которая была создана в другой среде.

Моя локальная установка — Mac OSX, а Docker работает в Linux.

Решением для меня было добавить файл .dockerignore в корень моего приложения и добавить node_modules в соответствии с этим предложением https://stackoverflow.com/a/55657576/3258059

Затем мне нужно было инициировать установку пряжи для повторного запуска в моем контейнере докеров, а также выполнить команду перестроения node-sass с контейнером докеров: docker-compose run web npm rebuild node-sass, где web — это имя моего контейнера докеров.

Я подозреваю, что мой Dockerfile может немного раздуваться, но я добавлю, если это кому-то поможет:

FROM ruby:2.3.7
ENV BUNDLER_VERSION=1.17.3
RUN gem install bundler -v "$BUNDLER_VERSION" --no-document
RUN curl -sL https://deb.nodesource.com/setup_8.x | bash -  
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -   
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list   
RUN apt-get update -qq && apt-get install -y nodejs yarn build-essential libpq-dev postgresql-client
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
ENV RAILS_ENV docker    
ENV WEBPACKER_DEV_SERVER_PUBLIC localhost:3035  
ENV WEBPACKER_DEV_SERVER_HOST localhost 
COPY package.json *yarn* ./
RUN bundle install
RUN yarn install
COPY . /myapp

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

и мой docker-compose.yml

version: '3'
services:
  db:
    image: postgres
    ports: 
      - "5433:5432"
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
  web:
    build: .
    environment: 
      - RAILS_ENV=development
      - NODE_ENV=development
      - WEBPACKER_DEV_SERVER_PUBLIC=localhost:3035
      - WEBPACKER_DEV_SERVER_HOST=localhost
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
      - redis
      #- elasticsearch
  redis:
    image: redis:alpine
person whatapalaver    schedule 22.05.2019
comment
во-вторых, это решение сработало для меня. Подробнее о моей ситуации: angular-cli использует node-sass 4.9.3, мой macos имеет узел 12; в то время как в контейнере у меня есть узел 10 и Debian (убедитесь, что ваш node-sass хорошо работает с вашей версией узла - видел, как несколько человек попались на этом). Исключите node_module в .dockerignore, сделайте ребилд node-sass, затем TA-DA - сработало. - person Shaung Cheng; 04.07.2019
comment
спасибо, ENV RAILS_ENV docker звучит неправильно, ENV RAILS_ENV development имеет больше смысла, пока вы не перейдете к prod - person ecoologic; 07.11.2019
comment
Вы, вероятно, правы. Я настроил отдельную среду, так как не все наши разработчики в данный момент используют Docker, и я не хотел вмешиваться в их настройку. - person whatapalaver; 07.11.2019
comment
Большое спасибо, .dockerignore из node_modules сделал свое дело. Похоже, мне не нужна была перестройка node-sass с моей стороны с node 10.16.3 // node-sass 4.13.0, но я с радостью увидел, что nodemon перезапускает экспресс-процедуры, принадлежащие docker-compose, с изменениями в osx dev env. Вы спасли меня от мозговой царапины :+1: - person kian; 15.11.2019

Я смог решить эту проблему, изменив:

RUN npm rebuild node-sass

to:

RUN npm rebuild node-sass --sass-binary-name = linux-x64-83

Указывая, какой дистрибутив запустить. В моем случае мне нужно было посмотреть, какую версию я запрашивал, в данном случае это Linux x64-83.

Вот список версий, которые могут существовать: https://github.com/sass/node-sass/releases

person Lucas Fernandes    schedule 22.02.2021

Я сделал это для докера, пряжи и реакции

# pull the base image
FROM node:lts-alpine

# set the working direction
WORKDIR /app

# add `/app/node_modules/.bin` to $PATH
ENV PATH /app/node_modules/.bin:$PATH

# install app dependencies
COPY package.json ./

COPY yarn.lock ./

# rebuild node-sass
RUN yarn add node-sass

RUN yarn

# add app
COPY . ./

# start app
CMD ["yarn", "start"]
person Ian Samz    schedule 22.07.2021