由主机卷共享覆盖的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 bash
在js_scripts
目录中docker-compose run node bash
和ls
,我只能看到来自主机卷的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会除去卷以外的所有内部容器)。 您有两个变体将主机和容器文件混合在一起:
- 容器启动后,将容器文件放入容器中。 (坏主意,容器文件将不会删除容器后被删除)
-
您可以将主机脚本放置在
/js_scripts
子文件夹中,也可以分别声明所有脚本:-v ./host_js_files/script1.js:/js_script/script1.js -v ./host_js_files/script2.js:/js_script/script2.js