如何在运行的Docker容器中集成.NET 5 SDK执行dotnet CLI命令?
解决方法
你的问题根源在于:当前运行的tami-app容器用的是aspnet:5.0镜像(Dockerfile的runtime阶段),这个镜像只包含.NET运行时,没有SDK,所以没法执行dotnet ef这类需要SDK支持的CLI命令。下面是几个可行的解决办法:
方法一:用SDK镜像临时执行命令(推荐,不改动现有容器)
直接基于mcr.microsoft.com/dotnet/sdk:5.0启动一个临时容器,挂载本地项目目录,在里面执行迁移命令:
- 执行以下命令启动带SDK的临时容器,同时把本地项目目录挂载到容器内:
docker run -it --rm -v $(pwd):/app mcr.microsoft.com/dotnet/sdk:5.0 bash - 在容器终端里切换到项目目录(比如
/app/src/Tami.Operations.Api),然后运行dotnet ef相关命令,例如:dotnet ef migrations add NewMigration --project ../Tami.Operations.Domain/ dotnet ef database update - 执行完后退出终端,临时容器会自动删除(因为加了
--rm参数)。
方法二:修改Dockerfile让运行容器包含SDK(适合开发环境)
如果需要长期在运行的容器里使用SDK,可以修改Dockerfile的runtime阶段,把基础镜像换成SDK镜像:
# 替换原runtime阶段的基础镜像 FROM mcr.microsoft.com/dotnet/sdk:5.0 AS runtime WORKDIR /Tami.Operations.Api COPY --from=build /Tami.Operations.Api/publish . ENTRYPOINT ["dotnet", "Tami.Operations.Api.dll"]
修改后重新构建镜像并启动容器:
docker build -t tami-app . docker stop tami-app && docker rm tami-app docker run -d --name tami-app tami-app
这样新容器里就有完整的SDK,你可以正常进入终端执行dotnet ef命令。不过这个方法会让镜像体积变大,适合开发环境,生产环境不建议用。
方法三:本地安装SDK直接执行命令(最便捷)
如果你的本地机器已经安装了.NET 5 SDK,完全不需要进入容器,直接在本地项目目录下执行dotnet ef命令,只要确保连接字符串指向容器内的数据库即可。比如修改项目里的appsettings.json,把数据库地址改成容器的IP或者端口映射后的本地地址,然后运行:
dotnet ef migrations add NewMigration --project src/Tami.Operations.Domain/ --startup-project src/Tami.Operations.Api/ dotnet ef database update --startup-project src/Tami.Operations.Api/
内容的提问来源于stack exchange,提问作者Zvi
相关产品推荐
相关产品推荐

