我试图将Docker用作Windows中的开发环境。
我正在开发的应用程序使用Node,NPM和Bower来设置开发工具,Grunt用于运行任务,并包含实时重新加载,以便在代码更改时应用程序更新。很标准。它在Docker之外工作正常,但无论我如何尝试在Docker中执行它,我都会遇到Grunt错误Fatal error: Unable to find local grunt.
。
我最近的努力包括在构建时将所有npm和bower依赖项安装到映像中的app目录,以及将应用程序的Gruntfile.js
复制到该目录。
然后在Docker-Compose中创建一个链接到主机应用程序的卷,并让Grunt使用Grunt的--base
选项观看该卷。它仍然没有工作。我仍然得到了致命的错误。
以下是有问题的Docker文件:
Dockerfile:
# Pull base image.
FROM node:5.1
# Setup environment
ENV NODE_ENV development
# Setup build folder
RUN mkdir /app
WORKDIR /app
# Build apps
#globals
RUN npm install -g bower
RUN echo '{ "allow_root": true }' > /root/.bowerrc
RUN npm install -g grunt
RUN npm install -g grunt-cli
RUN apt-get update
RUN apt-get install ruby-compass -y
#locals
ADD package.json /app/
ADD Gruntfile.js /app/
RUN npm install
ADD bower.json /app/
RUN bower install
搬运工-compose.yml:
angular:
build: .
command: sh /host_app/startup.sh
volumes:
- .:/host_app
net: "host"
startup.sh:
#!/bin/bash
grunt --base /host_app serve
我能在Docker中实际运行应用程序的唯一方法是在构建时将所有文件复制到映像,在那里创建dev依赖项,然后对复制的文件运行Grunt。但是每次我在应用程序中更改任何内容时,我都必须运行一个新版本。
一定有办法吗?根据Docker自己的Django quick startup instructions,我的Django应用程序能够在Docker中进行实时重新加载没有任何问题。所以我知道实时重载可以与Docker一起使用。
PS:我已经尝试将Grunt文件留在Volume上并使用Grunt的--gruntfile
选项,但它仍然崩溃。我也尝试在共享卷中的Docker-Compose时创建依赖项,但是我遇到了npm错误,用于解包tars。我得到的印象是,虚拟机无法处理通过共享文件系统和扼流圈运行的数据量,或者Windows文件系统无法正确存储Linux文件。或者其他什么。