我是docker的新手,所以这听起来有点基本的问题。
我有一个VS.Net core2控制台应用程序,该应用程序可以采用一些命令行参数并提供不同的服务。因此,在正常的命令提示符下,我可以运行
c:>dotnet myapplication.dll 5000 .\mydb1.db
c:>dotnet myapplication.dll 5001 .\mydb2.db
会在端口5000
和5001
上创建此应用程序列表的2个实例。
我现在想为此应用程序创建一个docker容器,并希望运行该映像的多个实例,并能够将此参数作为命令行传递给docker run
命令。但是我看不到如何在docker-compose.yml
或Dockerfile
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
我试图避免在每个命令行参数组合中创建多个图像。这样有可能实现我的期望吗?
答案 0 :(得分:2)
Docker容器以入口点和命令启动;当容器实际启动时,它们只是简单地串联在一起。如果Dockerfile
中的ENTRYPOINT的结构类似于单个命令,则Dockerfile
中的command:
或docker-compose.yml
中的CMD包含它的参数。
这意味着您应该可以将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:
规范中的第二个端口匹配,在我的示例中,我选择了具有两者都侦听“正常” HTTP端口,然后使用ports:
设置在主机上重新映射。如果需要,一个容器可以到达默认HTTP端口上的http://my.app2/
,到达另一个容器。)< / p>