Ert*_*ohl 5 node.js node-modules docker dockerfile docker-compose
我正在与一个使用Docker和Node构建的repo的团队合作.当其他人安装节点包时,我将git pull这些更改为package.json和package-lock.json.
不过,我不能只运行docker-compose build然后docker-compose up安装这些新的节点包.我必须先docker-compose down -v.这是因为我们使用卷来存储节点模块.我们并不依赖于此,坦率地说,只是将模块存储在docker图像层中.但是,当我们绑定应用程序卷(- .:/appin docker-compose.yml)时,node_modules图像中的文件夹将被遮蔽.
感觉我们对此采取了错误的方法,但这似乎是普遍接受的做法.我们的设置基于" 在Docker中构建节点应用程序的经验教训 "
我们Dockerfile:
FROM node:8.4.0
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install --loglevel=error --progess=false
COPY . /app/
Run Code Online (Sandbox Code Playgroud)
我们docker-compose.yml:
---
version: '2.1'
services:
main:
build:
context: .
volumes:
- .:/app
- /app/node_modules
container_name: main
command: ['node', 'index.js']
Run Code Online (Sandbox Code Playgroud)
我对该问题的理解是,在该docker-compose.yml文件中,该卷- /app/node_modules创建了一个卷,它将节点模块从图像层内部复制到一个卷中,这意味着当我们使用不同的内容再次构建应用程序时package.json,图像会更新但不会更新体积.down音量迫使它从更新的图像重新复制node_modules,这就是为什么有效.如果我的理解不正确,请告诉我:)
我们在AWS ECS中运行,所以不幸的是我们只能使用17.03.2-ce中提供的docker功能(目前没有多级docker文件).
这是一个老问题,但如果其他人遇到同样的问题,我也遇到了这个问题,这就是我如何实现所需的行为:
docker-compose up --build --renew-anon-volumes
Run Code Online (Sandbox Code Playgroud)
根据docker-compose up https://docs.docker.com/engine/reference/commandline/compose_up/上的文档
| 选项 | 短的 | 描述 |
|---|---|---|
| --更新匿名卷 | -V | 重新创建匿名卷,而不是从以前的容器中检索数据。 |
这样,您不仅可以构建新映像,还可以覆盖用于存储的原始卷node_modules。请注意,它不适用于命名卷。如果您使用命名卷,则需要在再次docker volume rm <volume-name>运行之前手动删除该卷docker-compose up。
从最初的问题中对卷如何工作的理解似乎是合理的。读者可能还会发现 Github Issue 中的以下讨论有助于理解它。
https://github.com/moby/moby/issues/30647#issuecomment-276882545
| 归档时间: |
|
| 查看次数: |
936 次 |
| 最近记录: |