我正在python中构建一个具有javascript文件的应用程序。我想使用,所以我想安装一些节点模块,我可以在我的js文件中使用### 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.
调用。我希望这些节点模块只在我的容器中,而不是主机。这是我的节点特定容器的Docker设置。
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
现在,当我在ls
目录中运行容器js_scripts
和node_modules
时,我只看到来自主机卷的js文件,而我的node_modules
目录不可见。这是有意义的,基于在docker中设置卷的方式。
但是我想在容器中使用这些browserify
来成功运行fetch_headers
(查找这些节点模块)。如果没有在容器中全局安装节点模块或者必须在主机中安装模块,有没有一种好的方法呢?
感谢您的意见。
答案 0 :(得分:1)
通过文件夹共享将主机文件与docker容器文件混合是一个坏主意。容器删除docker后删除所有容器数据。 Docker应该知道哪些文件属于容器以及哪些文件属于托管(Docker会删除除卷之外的所有内部容器)。您有两种变体可将主机和容器文件混合在一起:
您可以将主机脚本放在/js_scripts
的子文件夹中,也可以单独声明所有脚本:
-v ./host_js_files/script1.js:/js_script/script1.js -v ./host_js_files/script2.js:/js_script/script2.js
答案 1 :(得分:1)
容器应该是无状态的。如果销毁容器,其中的所有数据都将被销毁。您可以将node_modules目录作为卷安装,以避免在创建新容器时下载所有依赖项。
请参阅此示例,即安装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