我的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
等子文件夹,但我不希望这些更改进入我的本地计算机。因此,我有两个选择:
--prefix='/tmp'
中的node install
并将src挂载为ro
COPY
src,然后容器可以在任何地方写入。 解决方案1破坏了破坏,因为现在我必须将所有文件(如package.json,index.html等)复制/链接到前缀位置。 解决方案2就是我上面所做的。
当我使用COPY时,一切都很好。但现在的问题是,在源代码发生变化后,我想每次都更新图像中的源代码:
sudo docker-compose down && sudo docker-compose up --build -d
但是COPY命令由docker缓存,即使在文件更改后也不会更新。
TL; DR:我有一个src文件夹'webapp',我想从主机挂载为readonly,但我的应用程序想要写入子文件夹'webapp / node_modules'。
答案 0 :(得分:2)
要在只读装载体内创建可写装载,您需要确保只读目录具有装载点(文件夹),即使它们是空的。
要创建空挂载点并提交它们,请参阅this answer。
对于运行节点,您需要关注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:
答案 1 :(得分:0)
您可以使用内部docker-volumes。
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>
找到。
Redis服务使用另一种类型的卷,这些卷更受欢迎,用于在容器目录中挂载主机目录。 data
文件夹与docker-compose.yml文件所在的目录位于同一目录中,此文件夹安装在/data
的容器内。
答案 2 :(得分:0)
您是否可以在一些子目录中存储您想要编辑的所有代码(比如src
)?如果是,那么您可以执行以下操作
COPY
,这可能是部署所需要的。src
挂载到/usr/src/app/webapp/src
。