如何与 docker-compose up 一起传递参数?

问题描述 投票:0回答:9

我有一个

docker-compose.yml
文件,在终端中我是
typing docker-compose up [something]
,但我还想将参数传递给
docker-compose.yml
。这可能吗?我已阅读有关插值变量的信息,并尝试使用
.yml
然后使用
${testval}
docker-compose up [something] var="test"
文件中指定变量,但收到以下错误:

警告:未设置 testval 变量。默认为空白字符串。
错误:没有此类服务:

testval=test

docker docker-compose
9个回答
32
投票

基于 dnephin 答案,我创建了这个 示例存储库,您可以将变量传递给 docker-compose up。

使用方法很简单:

电脑/Linux
  • TEST= docker-compose up
    创建并启动
    app
    db
    容器。然后该 API 应该在端口 3030 上的 docker 守护进程上运行。
  • TEST=DO docker-compose up
    创建并启动
    app
    db
    容器。 API 应执行
    npm run test
    文件内的
    package.json
Windows(Powershell)
  • $env:TEST="";docker-compose up
    创建并启动
    app
    db
    容器。然后该 API 应该在端口 3030 上的 docker 守护进程上运行。
  • $env:TEST="do";docker-compose up
    创建并启动
    app
    db
    容器。 api 应执行
    npm run test
    文件中的
    package.json

24
投票

您需要确保两件事:

  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 镜像中。


17
投票

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

testvar=test docker-compose up ...

export testvar=test
docker-compose up

3
投票

我不确定你想在这里做什么,但如果你需要将环境变量传递给特定容器,docker-compose.yml 允许你这样做:

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

此变量将特定于您指定的容器,并且不会在容器之间共享。

“docker-compose up”也不需要任何参数。


3
投票

来自文档:

https://docs.docker.com/compose/reference/up/

https://docs.docker.com/compose/reference/build/

您无法将参数传递给 docker-compose up,但您可以将参数传递给 docker-compose build:

docker-compose build --build-arg KEY1=VALUE1 --build-arg KEY2=VALUE2


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 及更高版本。玩得开心


0
投票

Compose 支持在项目目录中名为

.env
的环境文件中声明默认环境变量。

第1步: 在项目目录下创建一个名为

.env
的文件

第2步: 以

VAR=VAL

的形式声明变量

注意:引号没有特殊处理,即

TESTVAL='test'
表示
TESTVAL is '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}

0
投票

我试图找到批处理文件的解决方案,基于Rafael Delboni回答你可以在批处理文件中添加命令来调用powershell:

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

但相反,因为在批处理文件中调用 powershell 的成本很高,您可以在批处理文件中初始化 TEST 变量,然后调用 docker-compose 命令。 像这样的东西:

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

0
投票

我对这个问题的解决方案是:

docker-compose.yml(示例)

services:
  myservice:
  build:
    context: .
    dockerfile: dockerfile
  command: ./data/scripts/runner.sh
  environment:
    - cmdpath=/data/src
    - precmd=touch .testexample
  volumes:
    - "./output:/data/output"
    - "./src:/data/src"

runner.sh(示例)

#!/bin/bash

if [[ -z "${cmd}" ]] || [[ -z "${cmdpath}" ]] ; then
  echo "ERROR: sem 'cmd' ou 'cmdpath'"
else
  cd ${cmdpath}

  if ! [[ -z "${precmd}" ]]; then
    echo "running  precmd '${precmd}'"

    eval "${precmd}"
  fi

  echo "running  command '${cmd}'"

  eval "${cmd}"
fi

然后,我可以像这样运行容器:

> docker compose run --rm -e cmd="ls -la > /data/output/out.txt" myservice

在此示例中,环境“cmd”通过“-e”选项通过“run”命令传递。 然后,“运行脚本”获取此环境并使用它。

注意:这将列出 ./src 路径中的本地文件(请参阅卷)。

© www.soinside.com 2019 - 2024. All rights reserved.