在docker中只写入源文件的可写node_modules

我的webapp/Dockerfile看起来像这样:

 FROM project_base-container EXPOSE 9100 # ... # Using copy instead of mount, since we need to write in sub-directories like node_modules etc. COPY . /usr/src/app/webapp CMD ["bash", "webapp/scripts/build_and_run.sh", "setup_deps_and_run_app"] 

我想让应用程序能够读取源代码,并写入到像node_modules这样的子文件夹中,但是我不希望这些更改来自我的本地机器。 因此,我有两个select:

  1. node install更改--prefix='/tmp' ,并将src node installro
  2. 复制src,然后容器可以写任何想要的地方。

解决scheme1破坏浩劫,因为现在我必须复制/链接像package.json,index.html等所有文件的前缀位置。 解决scheme2就是我上面所做的。

当我使用COPY时,一切都很好。 但是现在的问题是,在源代码发生变化之后,我想每次更新映像中的源代码:

 sudo docker-compose down && sudo docker-compose up --build -d 

但是COPY命令是由dockercaching的,即使在文件改变之后也不会被更新。


TL; DR:我有一个src文件夹'webapp',我想从主机挂载为readonly,但我的应用程序想写入子文件夹'webapp / node_modules'。

要在只读安装中创build可写安装,您需要确保只读目录具有安装点(文件夹),即使它们是空的也是如此

要创build空的挂载点并提交它们,请看这个答案 。

对于运行节点,您需要以下4个文件夹可写:

 $ mkdir webapp/frontend/node_modules webapp/frontend/build webapp/frontend/.config webapp/frontend/.npm $ cat > webapp/frontend/node_modules/.gitignore # Ignore everything in this directory * # Except this file !.gitignore $ git add -f webapp/frontend/node_modules/.gitignore $ cat docker-compose.yml # Filtered output below version: "2" services: webapp: build: ./webapp expose: - "9900" # Named volumes, defined below. volumes: - ./webapp:/usr/src/app/webapp:ro - webapp_config:/usr/src/app/webapp/frontend/.config:rw - webapp_npm:/usr/src/app/webapp/frontend/.npm:rw - webapp_node_modules:/usr/src/app/webapp/frontend/node_modules:rw - webapp_build:/usr/src/app/webapp/frontend/build:rw - ./config.ini:/usr/src/app/config.ini:ro # Named volumes. These will stay in the host, but not in the current directory. volumes: webapp_node_modules: webapp_build: webapp_config: webapp_npm: 

  • 相关的答案关于在只读装载可写文件夹
  • 在Docker中查看这个文档了解不同的卷/存储选项
  • 相关的问题

您可以使用内部泊坞窗。

 version: "3" services: postgres: image: postgres:9.4 volumes: - db-data:/var/lib/db redis: image: redis ports: - "6379:6379" volumes: - ./data:/data volumes: db-data: 

从文档

阐释:

Postgress服务使用一个命名卷,它位于docker安装目录中。 对于Ubuntu,它是/var/lib/docker/aufs/ 。 这个目录可能是不同的,可以通过使用docker inspect <vulume_name>来find。

Redis服务使用另一种types的卷,这些卷更受欢迎,用于将主机目录挂载到容器目录中。 data文件夹与docker-compose.yml文件所在的目录位于同一目录中,并且此文件夹安装在容器的/data

是否有可能将所有可编辑的代码存储在某个子目录中(比如说src )? 如果是,那么你可以做到以下几点

  • 像现在这样使用COPY ,这可能是部署所需要的。
  • 另外(只读)在开发过程/usr/src/app/webapp/src挂载到/usr/src/app/webapp/src