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