jub*_*ess 5 sass node.js docker node-sass docker-compose
我正在尝试将我的节点应用程序停靠.我当前的应用程序是一个带有postgresql的nodejs express服务器.ExpressJS使用node-sass-middleware来处理sass资产.当我在我的OSX机器上本地运行node和postgresql时,一切正常.当我尝试运行应用程序时,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
Run Code Online (Sandbox Code Playgroud)
这是我的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
Run Code Online (Sandbox Code Playgroud)
当我运行docker-compose时,我仍然会收到以下错误:
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 Code Online (Sandbox Code Playgroud)
我通过添加RUN npm rebuild node-sass到Dockerfile,它将为docker容器中的操作系统构建正确的绑定......但它似乎不起作用.
有什么想法吗?
在 Docker 中运行我的应用程序时,我遇到过几次这个问题。我相信在使用 Docker 安装我的本地应用程序目录时会出现问题,因为这包括在不同环境中构建的 node_modules 文件夹。
我的本地设置是 Mac OSX,而 Docker 在 linux 中运行。
我的解决方案是在我的应用程序的根目录中添加一个 .dockerignore 文件,并node_modules按照此建议添加/sf/answers/3896030351/
然后,我需要触发 yarn install 在我的 docker 容器中再次运行,并使用 docker 容器运行 node-sass 重建命令:docker-compose run web npm rebuild node-sass其中 web 是我的 docker 容器的名称。
我怀疑我的 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"]
Run Code Online (Sandbox Code Playgroud)
和我的 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
或者您可以在本地下载绑定,然后从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
Run Code Online (Sandbox Code Playgroud)
请密切注意预编译的本机绑定的不同版本:https://github.com/sass/node-sass/releases
| 归档时间: |
|
| 查看次数: |
9485 次 |
| 最近记录: |