由主机卷共享覆盖的Docker容器文件

我正在build立一个应用程序在Python中有JavaScript文件。 我想使用browserify ,所以我想要安装一些节点模块,我可以在我的js文件中使用require调用。 我只需要这些节点模块在我的容器而不是主机。 这是我的节点特定容器的Docker设置。

 ### Dockerfile FROM node:5.9.1 RUN npm install -g browserify RUN mkdir /js_scripts ADD package.json /js_scripts/ WORKDIR /js_scripts RUN npm install # This installs required packages from package.json RUN ls # lists the node_modules directory indicating successful install. 

现在我想用这个容器从我的主机共享js files ,这样我就可以在容器中运行browserify main.js -o bundle.js命令。 这是我docker-compose.yml ,它将host_js_files复制到我的js_scripts目录中。

 node: build: . volumes: - ./host_js_files:/js_scripts 

现在,当我运行一个容器docker-compose run node bashjs_scripts目录中docker-compose run node bashls ,我只能看到来自主机卷的js文件,而我的node_modules目录不可见。 这是有道理的,根据如何在docker设置卷。

不过,我想要在容器中的这些node_modules成功运行node_modules (寻找这些节点模块)。 有没有一种好的方法来做到这一点,而不是在容器中全局安装节点模块,或者必须在主机中安装模块?

感谢您的input。

容器应该是无状态的。 如果你销毁了容器,它里面的所有数据都将被销毁。 您可以将node_modules目录挂载为一个卷,以避免在创build新容器时始终下载所有依赖关系。 看一下安装browserify这个例子:

 ### docker-compose.yml node: image: node:5.9.1 working_dir: /js_scripts command: npm install browserify volumes: - $PWD/host_js_files:/js_scripts 

首先,你应该运行docker-compose up并等待所有的软件包都将被安装。 之后,您应该运行browserify命令为:

 docker-compose run node /js_scripts/node_modules/.bin/browserify /js_scripts/main.js -o /js_scripts/bundle.js 

通过文件夹共享将主机文件与docker容器文件混合起来是个不错的主意。 容器移除docker工具删除所有容器数据后。 Docker应该知道哪些文件属于容器,哪些容器需要托pipe(Docker会除去卷以外的所有内部容器)。 您有两个变体将主机和容器文件混合在一起:

  1. 容器启动后,将容器文件放入容器中。 (坏主意,容器文件将不会删除容器后被删除)
  2. 您可以将主机脚本放置在/js_scripts子文件夹中,也可以分别声明所有脚本:

    -v ./host_js_files/script1.js:/js_script/script1.js -v ./host_js_files/script2.js:/js_script/script2.js