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

时间:2016-03-30 16:20:22

标签: node.js docker browserify docker-compose

我正在python中构建一个具有javascript文件的应用程序。我想使用enter image description here,所以我想安装一些节点模块,我可以在我的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_scriptsnode_modules时,我只看到来自主机卷的js文件,而我的node_modules目录不可见。这是有意义的,基于在docker中设置卷的方式。

但是我想在容器中使用这些browserify来成功运行fetch_headers(查找这些节点模块)。如果没有在容器中全局安装节点模块或者必须在主机中安装模块,有没有一种好的方法呢?

感谢您的意见。

2 个答案:

答案 0 :(得分:1)

通过文件夹共享将主机文件与docker容器文件混合是一个坏主意。容器删除docker后删除所有容器数据。 Docker应该知道哪些文件属于容器以及哪些文件属于托管(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

答案 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