Docker-在 运行 之前编写卷挂载
Docker-compose volume mount before run
我从 docker-compose.yml.
指向一个 Dockerfile
我希望 docker-compose.yml 中的卷装载发生在 Dockerfile 中的 RUN
之前。
Docker 文件:
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 中传递更具体的位。也许这不是最佳做法?
您无法在 Docker 构建期间装载主机文件夹或卷。允许这样做会损害构建的可重复性。在 Docker 构建期间访问本地数据的唯一方法是构建上下文,它是您传递给 build
命令的 PATH
或 URL
中的所有内容。请注意,Dockerfile
需要存在于上下文中的某处。有关详细信息,请参阅 https://docs.docker.com/engine/reference/commandline/build/。
is correct, the volume layering means that what I was trying to do makes no sense. (There is another really good explaination on the 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脚本,它将不断循环直到它可以进入目录and运行npm install
。这仍然很脆弱,但它确实有效。 :)
我从 docker-compose.yml.
指向一个 Dockerfile我希望 docker-compose.yml 中的卷装载发生在 Dockerfile 中的 RUN
之前。
Docker 文件:
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 中传递更具体的位。也许这不是最佳做法?
您无法在 Docker 构建期间装载主机文件夹或卷。允许这样做会损害构建的可重复性。在 Docker 构建期间访问本地数据的唯一方法是构建上下文,它是您传递给 build
命令的 PATH
或 URL
中的所有内容。请注意,Dockerfile
需要存在于上下文中的某处。有关详细信息,请参阅 https://docs.docker.com/engine/reference/commandline/build/。
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脚本,它将不断循环直到它可以进入目录and运行npm install
。这仍然很脆弱,但它确实有效。 :)