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

Docker container files overwritten by host volume share

我正在 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

现在,当我在 js_scripts 目录中 运行 容器 docker-compose run node bashls 时,我只能看到主机卷中的 js 文件,以及我的 node_modules 目录不可见。根据 docker.

中卷的设置方式,这是有道理的

但是我希望容器中有这些 node_modules 才能成功 运行 browserify (它会查找这些节点模块)。有没有在容器中全局安装节点模块或不必在主机中安装模块的好方法?

感谢您的意见。

通过文件夹共享将主机文件与 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

容器应该是无状态的。如果销毁容器,则其中的所有数据都将被销毁。您可以将 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