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

start 2 dockers of the same build with different variables

我有以下 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

也许有一种方法可以在 docker-compose up 期间不通过构建参数而是直接将 SIGNAL_ID 传递给 Dockerfile
类似于 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 所在的目录中,放置一个带有环境变量的文件:

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

前面的变量

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