使用docker-compose调用docker容器时如何传递参数

4

我希望在调用docker-compose时为容器传递一些参数。

类似于以下代码:

docker-compose up -d myContainer myArg1=hallo myArg2=world

我的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]

docker-compose.yml文件如下:

version: '3.4'

services:

   myContainer:
      image: ${DOCKER_REGISTRY-}myContainerImage
      build:
         context: ../..
         dockerfile: MyProj/Dockerfile

首先,我想知道这是否可行,其次是如何实现它。


这个回答解决了你的问题吗?向Docker Compose传递参数 - KarateKid
2个回答

13
在Docker的命令行中,有两个“半部分”,即entrypointcommand。相应地,Docker Compose有entrypoint:command:指令来设置它们。它们之间的interaction非常简单:它们只是连接在一起以生成一个单独的命令行。
根据您展示的内容,在您的Dockerfile中,您可以编写
ENTRYPOINT ["dotnet", "myproj.dll"]

然后在你的docker-compose.yml文件中

command: myArg1=hallo myArg2=world

并最终使用这些参数启动该进程。
如果您想在启动Compose堆栈时能够从命令行指定此内容,Compose支持在任何地方使用 ${VARIABLE} 引用,因此您可以编写类似以下内容的内容
command: myArg1=${MY_ARG1:-hallo} world

然后使用类似以下命令启动:

MY_ARG1=greetings docker-compose up

在Docker中一个非常典型的模式是使用ENTRYPOINT作为包装脚本,该脚本进行一些首次设置,然后使用exec "$@"将命令作为主容器进程运行。Entrypoint将命令行参数作为参数,并可以对其进行任何操作,包括重新格式化或完全忽略它们。您还可以使用此方法来实现@Kevin的answer,即主要使用环境变量进行配置,但将其转换回var=value类型选项。

我应该在命令行中使用什么?如果我写“MY_ARG1=greetings docker-compose up”,它不起作用。命令行应该以docker-compose开头。 - user1472131
你需要每次运行 docker-compose up 时都能指定参数吗?还是在 YAML 文件中包含它就足够了? - David Maze
每次都要指定它们 - user1472131
1
docker-compose up在你所提出的问题中的语法中不接受参数,因此唯一的方法是使用环境变量来传递它们。如果您需要明确指定整个命令行,则Docker Compose可能不太适合您的需求,普通的docker run可能更好(甚至可以在Docker之外运行该工具)。 - David Maze

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接