visual-studio - 命令行参数不会传递给 Docker 容器入口点
问题描述
我创建了一个控制台应用程序来使用Benchmark.Net 库运行基准测试。这个应用程序被打包到一个 Docker 容器中,这是 docker-compose 场景的一部分。ENTRYPOINT
看起来dockerfile
像这样:
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Benchmarks.dll", "-f", "*"]
这些参数指示 Benchmark.Net 库运行该程序集中的所有测试。
问题:参数永远不会传递给控制台应用程序。docker-compose 没有command
orentrypoint
元素,它只是引用dockerfile
. 如果我CMD
与 结合使用ENTRYPOINT
,它没有任何效果:
ENTRYPOINT ["dotnet", "Benchmarks.dll"]
CMD [ "-f", "*" ]
我需要在 CI 上运行它,所以应该始终传递默认参数。
我究竟做错了什么?如何让它发挥作用?
更新:如果我使用纯docker run
命令运行它,它就可以正常工作并获取传递的参数。事实证明,当我从 运行它时docker-compose
,它不会打印任何内容。中的服务定义docker-compose.yml
非常简单,它只是引用Dockerfile
:
benchmarks:
build:
context: ../
dockerfile: test/Benchmarks/Dockerfile
args:
- NUGET_SOURCE
depends_on:
- another.service
environment:
- ASPNETCORE_ENVIRONMENT=Development
volumes:
- ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
- ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro
最终更新:不幸的是,我在最初的问题中忘记提到我是从 Visual Studio 内部使用dscproj
. 显然,VS 添加了关于如何运行 docker-compose 项目的自己的规则,覆盖了命令行。
尽管有一个丑陋的解决方法,但仍然没有合适的解决方案。
所以,我的问题是这个的重复。结案。
解决方案
我试图重现你的问题,但我不能。
这是我的程序(我做了dotnet new console
并将 Program.cs 更改为此)
using System;
namespace app
{
class Program
{
static void Main(string[] args)
{
foreach (var arg in args)
{
Console.WriteLine(arg);
}
}
}
}
还有我的 Dockerfile
FROM mcr.microsoft.com/dotnet/sdk:5.0 as publish
WORKDIR /app
COPY . ./
RUN dotnet publish -o out app.csproj
FROM mcr.microsoft.com/dotnet/runtime:5.0
WORKDIR /app
COPY --from=publish /app/out .
ENTRYPOINT ["dotnet", "app.dll", "-f", "*"]
然后我构建并运行它
docker build -t test .
docker run --rm test
它打印
-f
*
就像你期望的那样。
所以参数被传递给程序。您的问题可能是您没有将它们正确传递给 Benchmark?
编辑:使用这个 docker-compose.yaml 文件
version: "3.9"
services:
test:
image: "test"
command: ["more", "arguments"]
并且docker-compose up
(没有 -d,所以它在前台运行),它打印所有参数 - 来自入口点的参数和来自command
.
推荐阅读
- android - 你在哪里编写 Android Studio 中 Fragments 的逻辑?
- reactjs - 延迟 onClick 响应 React App(适用于第二次点击但不是第一次)
- excel - 对于 excel VBA,使用“for each...next”语句。如何一次使用所有迭代的元素
- javascript - 将按钮链接到在Javascript中
- c# - 物体被破坏时增加分数
- flask - 用于请求身份验证的带有中间件和 JWT 的 Web API(Python、Flask)引发 DecodeError('签名验证失败')
- excel - 将时间字段与时间范围进行比较以确定 Excel 中的值
- typescript - 如何访问打字稿中泛型的属性?
- java - UnmodifiableRandomAccessList 和“包含?”的问题 功能
- laravel-sanctum - laravel jetstream request api route middleware protected api:sanctum return unauthenticated response