首页 > 解决方案 > 命令行参数不会传递给 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 没有commandorentrypoint元素,它只是引用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 项目的自己的规则,覆盖了命令行。

尽管有一个丑陋的解决方法,但仍然没有合适的解决方案。

所以,我的问题是这个的重复。结案。

标签: visual-studiodockerdocker-composedockerfile

解决方案


我试图重现你的问题,但我不能。

这是我的程序(我做了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.


推荐阅读