使用不同的变量启动2个相同构建的docker

问题描述

我有以下Dockerfile

# beginning of the the docker ...
ARG SIGNAL_ID
CMD python ./my_repo/my_main.py --signal_id $SIGNAL_ID

我还有一个docker-compose.yml,其中包含服务所需的所有信息

version: '3'
services:
  my_app:
    build: .
# additional info ...

如何基于相同的Docker文件运行具有不同SIGNAL_ID的两个服务?

我尝试了以下操作,但是我不确定如何运行它们,因为它们都将被命名为my_app

docker-compose build --build-arg SIGNAL_ID=5
docker-compose build --build-arg SIGNAL_ID=6

也许有一种方法可以不在SIGNAL_ID期间将Dockerfile传递给docker-compose up,而不通过build-arg?
docker run -e SIGNAL_ID=5类似吗?


您可以有两个不同的docker-compose.yml,但是考虑到它们之间的唯一区别就是SIGNAL_ID,我想避免这种情况。

解决方法

最直接的解决方案是使$SIGNAL_ID不是构建参数,而是环境变量。从这里可以看出,它仅在运行时使用(在CMD命令中使用),而不在构建期间使用。

所以您可以做的是:

从Dockerfile中删除ARG命令:

CMD python ./my_repo/my_main.py --signal_id $SIGNAL_ID

在您的docker-compose文件中,创建两个具有不同环境变量的服务:

version: '3'
services:
  my_app1:
    environment:
    - SIGNAL_ID=1
  my_app2:
    environment:
    - SIGNAL_ID=2

就是这样。您现在可以开始使用

docker-compose up

要在没有docker-compose的情况下开始,您只需

docker build -t image-name .
docker run -e SIGNAL_ID=1 image-name
docker run -e SIGNAL_ID=2 image-name
,

我将使用环境变量。您有以下选择:

示例docker-compose.yamlMESSAGE将显示在网络服务器上)

version: '3'
services:
  web:
    environment:
      MESSAGE: ${MESSAGE}
    image: "bithavoc/hello-world-env"
    ports:
    - "3000:3000"

  1. .env文件

在docker-compose.yaml所在的目录中,放置一个带有env变量的文件:

MESSAGE="Message from File"

要运行它: docker-compose up

测试一下: curl localhost:3000应该从.env文件中打印文本。


  1. 通过CLI导出变量

要运行它: MESSAGE="Message from CLI" docker-compose up

要测试: curl localhost:3000应该显示您在docker-compose up前面的变量


更多文档的链接:https://docs.docker.com/compose/environment-variables/#the-env-file