如何将参数传递给 docker 运行 入口点?

How do you pass arguments to docker run entrypoint?

>docker run --entrypoint "dotnet test" api-tests

这表示在路径变量中找不到可执行文件。

>docker run --entrypoint "dotnet" api-tests

这有效但什么也没做。

如何传递多个参数?

例如dotnet test UnitTests.csproj --logger trx;LogFileName=/tests/test-results.trx

图像名称之后的任何内容替换任何已定义的 CMD 并作为参数发送到入口点。

所以如果你定义了一个入口点,你想将 'dotnet test' 传递给,你会做

docker run api-tests dotnet test

例如 alpine/curl 图像,它使用您传递的参数运行 curl。

docker run --rm alpine/curl -s https://www.google.com/

将获取 Google 的首页。参数只是-s https://www.google.com/。该图像以 curl 作为入口点,因此您无需指定它。

把它们加到最后就行了。 对于 ENTRYPOINT 它添加到 dockerfile 中指定的任何内容。 如果使用 CMD,它将替换它。

所以使用:

docker run api-tests test

如果你的 dockerfile 中有 ENRTYPOINT dotnet。 或者:

docker run api-tests dotnet test

如果你的 dockerfile 中有 CMD this-will-be-replaced

如果你需要docker run --entrypoint命令,只有第一个shell字(实际container-side二进制到运行)在那里。其余参数必须跟在图像名称之后,作为 docker run 命令语法中的“命令”参数。

docker run \
  --entrypoint dotnet \
  api-tests \
  test UnitTests.csproj --et=cetera

但是,您可以设计图像以避免需要它。如果图像使用 CMD 声明其主要命令而不是 ENTRYPOINT,那么您可以类似地在 docker run 命令的“命令”部分提供覆盖命令。

CMD ["dotnet", "MyApp.dll"] # and not ENTRYPOINT
docker run --rm api-tests \
  dotnet test UnitTests.csproj --et=cetera

我倾向于为以 exec "$@" 结尾的包装脚本保留 ENTRYPOINT,因此它仍然 运行 是 CMD,或者对于 FROM scratch 图像,其中除了图像中的单个二进制文件之外几乎不可能 运行 任何东西。