我先从标准的方式开始
2。 Dockerfile
使用 Dockerfile 可以避免尝试解决如何设置 docker-compose 服务依赖项或外部构建脚本来填充卷并在 docker-compose up 之前工作。
可以设置 Dockerfile,因此只有更改 bower.json 和 package.json 才会触发重新安装 node_modules 或 bower_components。
在某些时候,首先安装的命令必须使第二个命令缓存无效,因此您放置它们的顺序很重要。哪个更新最少,或者速度明显较慢,应该先行。如果要先运行 bower 命令,可能需要全局手动安装 bower。
如果您担心 NPM 版本控制,请查看使用 yarn 和 yarn.lock 文件。纱线也会加快速度。 Bower 可以只设置特定版本,因为它没有 NPM 的相同子模块版本控制问题。
文件Dockerfile
FROM mhart/alpine-node:6.9.5
RUN npm install bower -g
WORKDIR /app
COPY package.json /app/
RUN npm install --production
COPY bower.json /app/
RUN bower install
COPY / /app/
CMD ["node", "server.js"]
档案.dockerignore
node_modules/
bower_components/
这在 docker-compose build: 节中都得到了支持
1。 Docker Compose + 卷
填充卷的最简单/最快的方法是在图像中填充目录后在Dockerfile 中定义VOLUME。这将通过撰写工作。当图像已经具有所需的内容时,我会质疑使用卷的意义......
任何其他的填充方法都需要一些非 compose 的自定义构建脚本。一种选择是docker run 一个附加了所需卷的容器,并用npm/bower install 填充它。
docker run \
--volume myapp_bower_components:/bower_components \
--volume bower.json:/bower.json \
mhart/alpine-node:6.9.5 \
npm install bower -g && bower install
和
docker run \
--volume myapp_mode_modules:/node_modules \
--volume package.json:/package.json \
mhart/alpine-node:6.9.5 \
npm install --production
然后您将能够在您的应用容器上安装填充的卷
docker run \
--volume myapp_bower_components:/bower_components \
--volume myapp_node_modules:/node_modules \
--port 3000:3000
my/app
您可能还需要为卷名提出某种版本控制方案,以便您可以回滚。对于图像已经为您所做的事情,听起来像是付出了很多努力。
或者可能查看rocker,它提供了一个替代的 docker 构建系统,让您可以执行 Docker 开发人员反对的所有事情,例如在构建期间挂载目录。这再次超出了 Docker Compose 支持的范围。