docker 文件删除后挂载的卷
docker volume mounted after files were deleted
当我将本地 build
目录挂载到容器 /app/build
,然后执行 docker-compose up
,它会生成一个 /app/build
目录,期望它存在于本地 build
目录,但那里什么也没有。
如果没有挂载,容器 /app/build
目录有预期的文件
你想达到什么目的?在 docker 的构建步骤中,应将构建的包复制到映像中。之后启动镜像就足够了,不需要将带有构建工件的卷安装到 运行 容器,因为文件已经在镜像中了。
示例:
docker compose build
仅修改构建容器内的内容,然后将其作为层写入构建镜像。
如您所见,Dockerfile
中的 COPY ./package .
执行预期的操作,但仅限于容器内部。还有以下
RUN bash -c 'source ~/.nvm/nvm.sh \
&& nvm install 17.1.0 \
&& npm install'
做预期的事情,因为 node_modules
文件夹存在于容器中。您也可以通过查看文件时间戳来验证这一点。
要获得您想要的行为,您可以执行以下操作:
docker run --rm -it -v ${pwd}:/app ubuntu:20.04 bash
apt update
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
cd /app
cp -Rv package/* .
source ~/.nvm/nvm.sh \
&& nvm install 17.1.0 \
&& npm install
touch build/x
exit
dir .\build\
正如您在屏幕截图中看到的,容器外的文件系统是使用这种方法修改的:
总结:
- 使用
docker compose build
在容器内构建项目,无需修改外部文件系统
- 如果您希望构建修改外部文件系统,请使用
docker run -v -v ${pwd}:/app
。
当我将本地 build
目录挂载到容器 /app/build
,然后执行 docker-compose up
,它会生成一个 /app/build
目录,期望它存在于本地 build
目录,但那里什么也没有。
如果没有挂载,容器 /app/build
目录有预期的文件
你想达到什么目的?在 docker 的构建步骤中,应将构建的包复制到映像中。之后启动镜像就足够了,不需要将带有构建工件的卷安装到 运行 容器,因为文件已经在镜像中了。
示例:
docker compose build
仅修改构建容器内的内容,然后将其作为层写入构建镜像。
如您所见,Dockerfile
中的 COPY ./package .
执行预期的操作,但仅限于容器内部。还有以下
RUN bash -c 'source ~/.nvm/nvm.sh \
&& nvm install 17.1.0 \
&& npm install'
做预期的事情,因为 node_modules
文件夹存在于容器中。您也可以通过查看文件时间戳来验证这一点。
要获得您想要的行为,您可以执行以下操作:
docker run --rm -it -v ${pwd}:/app ubuntu:20.04 bash
apt update
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
cd /app
cp -Rv package/* .
source ~/.nvm/nvm.sh \
&& nvm install 17.1.0 \
&& npm install
touch build/x
exit
dir .\build\
正如您在屏幕截图中看到的,容器外的文件系统是使用这种方法修改的:
总结:
- 使用
docker compose build
在容器内构建项目,无需修改外部文件系统 - 如果您希望构建修改外部文件系统,请使用
docker run -v -v ${pwd}:/app
。