调用 docker-compose 时将参数传递给 docker 容器

use*_*131 5 docker dockerfile docker-compose

我的目的是在调用该容器的 docker-compose 时能够将一些参数传递给 docker 容器。

就像是

docker-compose up -d myContainer myArg1=hallo myArg2=world
Run Code Online (Sandbox Code Playgroud)

我的 Docker 文件看起来像:

FROM mcr.microsoft.com/dotnet/core/runtime:2.2 AS final
WORKDIR /app
COPY Myproj/bin/Debug/netcoreapp2.1 .
ENTRYPOINT ["dotnet", "myproj.dll", myArg1, myArg2]
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml 文件如下所示:

version: '3.4'

services:

   myContainer:
      image: ${DOCKER_REGISTRY-}myContainerImage
      build:
         context: ../..
         dockerfile: MyProj/Dockerfile
Run Code Online (Sandbox Code Playgroud)

首先我想知道这是否可行,其次我想知道如何做到

Dav*_*aze 13

Docker 最终运行的命令行有两个“部分”:入口点命令。有相应的 Docker Composeentrypoint:command:指令来设置它们。它们的交互相当简单:它们只是连接在一起以生成单个命令行。

鉴于您所展示的内容,您可以在 Dockerfile 中编写

ENTRYPOINT ["dotnet", "myproj.dll"]
Run Code Online (Sandbox Code Playgroud)

然后在你的docker-compose.yml

command: myArg1=hallo myArg2=world
Run Code Online (Sandbox Code Playgroud)

这将最终启动带有这些论点的进程。

如果您希望在启动 Compose 堆栈时能够从命令行指定这一点,Compose 支持${VARIABLE}到处引用,因此您可以编写类似的内容

command: myArg1=${MY_ARG1:-hallo} world
Run Code Online (Sandbox Code Playgroud)

然后使用如下命令启动它

MY_ARG1=greetings docker-compose up
Run Code Online (Sandbox Code Playgroud)

Docker 中一个非常典型的模式是使用ENTRYPOINT包装器脚本进行一些首次设置,然后使用exec "$@". 入口点将命令行参数作为参数,并且可以对它们执行任何操作,包括重新格式化它们或完全忽略它们,您还可以使用它来实现 @Kevin 的答案,即主要使用环境变量进行配置,但将其翻译回来键入var=value选项。


小智 1

我认为你需要使用环境变量,你可以用它启动你的命令。

像这样的事情:(有多种方法可以做到这一点)

在撰写中: https: //docs.docker.com/compose/environment-variables/

environment:
- myVar
Run Code Online (Sandbox Code Playgroud)

在 dockerfile 中: https://docs.docker.com/engine/reference/builder/#env

ENTRYPOINT ["dotnet", "myproj.dll", "$myVar"]
Run Code Online (Sandbox Code Playgroud)