Docker 运行 具有不同参数的图像的多个实例

Docker RUN multiple instance of a image with different parameters

我是 docker 的新手,所以这个问题听起来有点基础。

我有一个 VS.Net core2 控制台应用程序,它能够获取一些命令行参数并提供不同的服务。所以在正常的命令提示符下我可以 运行 类似

c:>dotnet myapplication.dll 5000 .\mydb1.db c:>dotnet myapplication.dll 5001 .\mydb2.db

这会在端口 50005001 上创建此应用程序列表的 2 个实例。

我现在想为此应用程序创建一个 docker 容器,并希望 运行 该图像的多个实例,并能够将此参数作为命令行传递给 docker run 命令。但是我无法在 docker-compose.ymlDockerfile

中看到如何配置它

DockerFile

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80

# ignoring some of the code here
ENTRYPOINT ["dotnet", "myapplication.dll"]

docker-Compose.yml

version: '3.4'
services:
  my.app:
    image: ${DOCKER_REGISTRY}my/app
    ports:
     - 5000:80
    build:
      context: .
      dockerfile: dir/Dockerfile

我试图避免为每个命令行参数组合创建多个图像。那么有可能实现我想要的吗?

Docker 容器以入口点和命令启动;当容器实际启动时,它们只是简单地连接在一起。如果 Dockerfile 中的 ENTRYPOINT 结构类似于单个命令,则 Dockerfile 中的 CMD 或 docker-compose.yml 中的 command: 包含它的参数。

这意味着您应该能够将 docker-compose.yml 设置为:

services:
  my.app1:
    image: ${DOCKER_REGISTRY}my/app
    ports:
     - 5000:80
    command: [80, db1.db]
  my.app2:
    image: ${DOCKER_REGISTRY}my/app
    ports:
     - 5001:80
    command: [80, db2.db]

(附带说明:如果程序的选项之一是要侦听的端口,则这需要匹配 ports: 规范中的第二个端口,在我的示例中我选择了让两者都监听 "normal" HTTP 端口并使用 ports: 设置将其重新映射到主机上。如果需要,一个容器可以到达另一个容器,因为默认 HTTP 上的 http://my.app2/端口。)