如何在使用docker-compose up命令时传递参数?

53
我有一个 docker-compose.yml 文件,在终端上我正在输入 docker-compose up [something],但我也想将参数传递给 docker-compose.yml。这个可行吗?我已经阅读过关于插值变量的信息,并尝试在 .yml 文件中使用 ${testval} 指定变量,然后用 docker-compose up [something] var=“test” 但我收到以下错误:

警告:testval 变量未设置。默认为空字符串。
错误:没有这样的服务:testval=test

8个回答

31

基于dnephin answer,我创建了这个示例repo,可以将变量传递给docker-compose up。

使用方法很简单:

  • TEST= docker-compose up创建并启动appdb容器。然后API应该在端口3030上运行在您的Docker守护程序上。
  • TEST=DO docker-compose up创建并启动appdb容器。然后API应该在package.json文件中执行npm run test
  • 使用$env:TEST="";docker-compose up命令创建并启动appdb容器。然后,API应该在端口3030上在您的Docker守护程序上运行。
  • 使用$env:TEST="do";docker-compose up命令创建并启动appdb容器。然后,API应该在package.json文件中执行npm run test命令。

22

您需要确保两件事情:

  1. docker-compose.yml文件中声明了环境变量。例如:
services:
    app:
        image: python3.7
        environment:
            - "SECRET_KEY=${SECRET_KEY}"
  1. 在调用docker-compose up时,在环境中使变量可用:
SECRET_KEY="not a secret" docker-compose up

请注意,这并不等同于在构建过程中传递它们,因为在Docker镜像中存储机密信息是不可取的。


小心终端环境变量。它们可能会替换从docker-compose传递给dockerfile的某些参数,并在构建过程中导致意外的参数变量。 - Zincfan

16

您需要将变量作为环境变量传递:

testvar=test docker-compose up ...

或者
export testvar=test
docker-compose up

1
这不是我们想要的。即使在环境部分的composer文件中设置了主机环境变量,它们也不会被复制到容器中。如果必须设置构建变量,则必须使用composer文件的构建部分。我将在响应中发布它。 - Stan Sokolov
你的回答非常有帮助! - Darlan Dieterich

4

1
问题是关于传递给 'docker-compose up' 的参数,不是 'docker-compose build'。 - undefined

3

我不确定你在这里想要做什么,但如果你需要将环境变量传递给特定的容器,则可以使用docker-compose.yml来实现:

web:
  ...
  environment:
    - RAILS_ENV=production
    - VIRTUAL_HOST=www.example.com
    - VIRTUAL_PORT=3011

这些变量将专门针对您指定的容器,不会在容器之间共享。

此外,“docker-compose up”不带任何参数。


2
处理构建参数时,请按照以下方式在Compose yml文件中声明它们。
services:
  app: (name of service
    build:
      context: docker/app/ (where is your docker build root)
      dockerfile: Dockerfile (that is optional)
      args:
        - COMPOSER_AUTH_TOKEN (name of variable, value will be taken from host environment)

在运行docker-compose up之前,按照其他人建议的导出变量。这样做会起作用,我已经试过了。请使用docker compose版本3及以上。玩得开心!

我该如何使用docker-compose文件将类似于'--shm-size=10.24gb'的内容传递给Docker? - mike01010

0

Compose支持在名为.env的环境文件中声明默认环境变量,该文件位于项目目录中。

步骤1: 在项目目录中创建一个名为.env的文件

步骤2: 以VAR=VAL的形式声明变量

注意:没有特殊处理引号,即TESTVAL='test'表示TESTVAL是'test'(带引号),而不仅仅是test。因此您需要将其声明为TESTVAL=test

步骤3: 在Compose文件中使用这些变量:

environment:
  myval=${TESTVAL}

文档:在文件中声明默认环境变量

奖励:如果您正在动态构建docker-compose.yaml中的镜像,则可以使用环境变量传递build args。例如:

version: "3.8"
services:
  myapp:
    build:
      context: ./myDir
      dockerfile: ./myDir/myDockerfile
      args:
      - MYARG=${TESTVAL}

我该如何将这样的内容从docker-compose传递到docker run命令中:'--shm-size=10.24gb' - mike01010

0

我正在尝试为批处理文件寻找解决方案,根据Rafael Delboni的回答,您可以在批处理文件中添加命令以调用PowerShell:

powershell $env:TEST="";docker-compose up ...

但是,因为在批处理文件中调用PowerShell很昂贵,所以你可以在批处理文件中初始化TEST变量,然后调用docker-compose命令。

set TEST = ...
docker compose up ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接