作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一个来自 docker-compose.yml 的 Dockerfile。
我希望 docker-compose.yml 中的卷挂载发生在 Dockerfile 中的 RUN
之前。
Dockerfile:
FROM node
WORKDIR /usr/src/app
RUN npm install --global gulp-cli \
&& npm install
ENTRYPOINT gulp watch
docker-compose.yml
version: '2'
services:
build_tools:
build: docker/gulp
volumes_from:
- build_data:rw
build_data:
image: debian:jessie
volumes:
- .:/usr/src/app
首先执行 Dockerfile,然后从 docker-compose 挂载是完全有意义的,但是有没有办法绕过它。
我想保持 Dockerfile 的通用性,同时从 compose 中传递更具体的位。也许这不是最佳做法?
最佳答案
Erik Dannenberg's是正确的,体积分层意味着我试图做的事情毫无意义。 (如果您想阅读更多内容,Docker website 上有另一个非常好的解释)。如果我想让 Docker 执行 npm install
那么我可以这样做:
FROM node
ADD . /usr/src/app
WORKDIR /usr/src/app
RUN npm install --global gulp-cli \
&& npm install
CMD ["gulp", "watch"]
但是,这不适合作为我的情况的解决方案。目标是使用 NPM 安装项目依赖项,然后运行 gulp 来构建我的项目。这意味着我需要对项目文件夹进行读写访问并且它需要在容器消失后仍然存在。
在挂载卷之后我需要做两件事,所以我想出了以下解决方案......
docker/gulp/Dockerfile:
FROM node
RUN npm install --global gulp-cli
ADD start-gulp.sh .
CMD ./start-gulp.sh
docker/gulp/start-gulp.sh:
#!/usr/bin/env bash
until cd /usr/src/app && npm install
do
echo "Retrying npm install"
done
gulp watch
docker-compose.yml:
version: '2'
services:
build_tools:
build: docker/gulp
volumes_from:
- build_data:rw
build_data:
image: debian:jessie
volumes:
- .:/usr/src/app
所以现在容器启动一个 bash 脚本,该脚本将不断循环,直到它可以进入目录并运行 npm install
。这仍然很脆弱,但它有效。 :)
关于运行前 Docker-compose 卷挂载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37089162/
我是一名优秀的程序员,十分优秀!