是否可以使用不同的参数多次运行docker容器?

时间:2020-09-23 19:58:52

标签: docker

我是Docker的新手,我试图找出是否有可能使用不同的参数多次运行应用程序。

我使用.Net开发了应用程序,到目前为止,我已经使用Ubuntu服务执行了所有实例,例如:

[Unit]
Description=swp %I

[Service]
Environment=ENV=PRODUCTION
Type=simple
User=foo
ExecStart=/usr/bin/dotnet /opt/swp/app.dll %i
WorkingDirectory=/opt/app
Restart=always
RestartSec=5

%I是我启动服务时传递的参数,例如:

sudo systemctl start app@argument1.service
sudo systemctl start app@argument2.service
sudo systemctl start app@argument3.service

因此,根据提供的参数,我有三个应用程序实例,它们以不同的逻辑运行。

如何使用Docker复制相同的内容?

2 个答案:

答案 0 :(得分:5)

使用docker完全可以做到这一点。您必须采取的第一步是从使用命令行参数到接受环境变量来修改应用程序。在此docker provides an easy method of using environment variables之后。

Docker Run

例如,您可以使用“环境”键在服务的容器中设置环境变量,就像docker run -e VARIABLE = VALUE

docker run -e DEBUG=1 web python console.py

ENV_FILE

或者您可以使用一个env文件。下面的示例显示一个env_file,将NODE_ENV环境变量设置为'test'

$ cat ./Docker/api/api.env
NODE_ENV=test

Docker Compose

就像docker run -e一样,您可以使用docker-compose run -e在一次性容器上设置环境变量

docker-compose run -e DEBUG=1 web python console.py

您也可以查看this question了解更多示例。

如果不可能或不太方便地修改程序以接受环境变量,则可以轻松地通过ARG in your dockerfile来修改CMD在启动时的运行方式。

答案 1 :(得分:3)

在Docker上执行此操作的方法是使用一对CMDENTRYPOINT

The table in the Docker documentation可能是理解它的更便捷方法,并且比详细描述要好。

但是简而言之,当您使用"parameters" form of CMD时,您可以对容器的ENTRYPOINT进行操作,从而使它可以运行的可执行文件。

这是您可以使用现有应用程序进行的一种非常简化的形式,只需删除此虚拟示例的echo中的ENTRYPOINT,就应该已经达到所需的行为:

FROM ubuntu

ENTRYPOINT ["echo", "/usr/bin/dotnet", "/opt/swp/app.dll"]
## This would be the default service, 
## if we run the container without any parameter
CMD ["app@argument1.service"] 
  1. 不带参数运行它:
    docker run 31f3db535473 
    /usr/bin/dotnet /opt/swp/app.dll app@argument1.service
    
  2. 使用第二个服务作为参数运行它:
    docker run 31f3db535473 app@argument2.service
    /usr/bin/dotnet /opt/swp/app.dll app@argument2.service
    
  3. 使用第三项服务作为参数运行它:
    docker run 31f3db535473 app@argument3.service
    /usr/bin/dotnet /opt/swp/app.dll app@argument3.service