Docker的-v指令使用记录 前言 最初接触Docker,是为了解决.NET项目部署的难题,特别是部署已编译的产物。当时使用的Dockerfile结构大致如下: FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app EXPOSE
最初接触Docker,是为了解决.NET项目部署的难题,特别是部署已编译的产物。当时使用的Dockerfile结构大致如下:
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app EXPOSE 5031 EXPOSE 7031 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src COPY . . ENTRYPOINT ["dotnet", "Personalblog.dll"]
后续的流程包括构建镜像和创建容器,使用的命令非常直接:
docker build -t app . docker run -d -p 80:80 --name app app
按照上述流程操作,项目确实能够成功运行。但很快会遇到一个实际问题:当项目代码需要更新时,必须首先删除容器,接着删除镜像,才能重新完成部署。如果仅仅删除容器而保留镜像,新创建的容器仍然会运行旧的代码。
问题产生的原因是什么?
核心原因在于没有进行主动的目录挂载。Docker默认会使用一个随机生成的名称挂载一个数据卷。若不删除镜像,这个默认卷将持续存在,导致所有新创建的容器都读取同一份过时的数据。
解决此问题的方法并不复杂,关键在于使用 -v 指令。
具体的命令调整如下:
docker run -d -p 80:80 -v 项目路径:/src --name app app
采用此方式部署后,容器内的 /src 目录将直接映射到本地的项目路径。此后项目若有更新,只需删除旧的容器,并用上述命令重新创建新容器即可,完全无需操作镜像。
需要说明的是,这里挂载的路径 /src 是基于.NET项目Dockerfile中 WORKDIR /src 的设置。其他类型的项目挂载点可能不同。尝试修改此路径时,容器启动似乎仍会自动生成一个src目录,其具体机制有待进一步研究。若有更优雅的解决方案,欢迎探讨与分享。
若需查看某个容器的详细挂载信息,可以使用命令:docker inspect 容器名。在输出的JSON信息中,定位 Mounts 字段,即可查看完整的挂载源路径与目标路径。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述