我有一个
docker-compose.yml
文件,在终端中我是 typing docker-compose up [something]
,但我还想将参数传递给 docker-compose.yml
。这可能吗?我已阅读有关插值变量的信息,并尝试使用 .yml
然后使用 ${testval}
在 docker-compose up [something] var="test"
文件中指定变量,但收到以下错误:
警告:未设置 testval 变量。默认为空白字符串。
错误:没有此类服务:testval=test
基于 dnephin 答案,我创建了这个 示例存储库,您可以将变量传递给 docker-compose up。
使用方法很简单:
电脑/LinuxTEST= docker-compose up
创建并启动 app
和 db
容器。然后该 API 应该在端口 3030 上的 docker 守护进程上运行。 TEST=DO docker-compose up
创建并启动 app
和 db
容器。 API 应执行 npm run test
文件内的 package.json
。 $env:TEST="";docker-compose up
创建并启动 app
和 db
容器。然后该 API 应该在端口 3030 上的 docker 守护进程上运行。 $env:TEST="do";docker-compose up
创建并启动 app
和 db
容器。 api 应执行 npm run test
文件中的 package.json
。 您需要确保两件事:
docker-compose.yml
声明了环境变量。例如,services:
app:
image: python3.7
environment:
- "SECRET_KEY=${SECRET_KEY}"
docker-compose up
时,变量在环境中可用:SECRET_KEY="not a secret" docker-compose up
请注意,这并不等同于在构建期间传递它们,因为不建议将机密存储在 docker 镜像中。
您需要将变量作为环境变量传递:
testvar=test docker-compose up ...
或
export testvar=test
docker-compose up
我不确定你想在这里做什么,但如果你需要将环境变量传递给特定容器,docker-compose.yml 允许你这样做:
web:
...
environment:
- RAILS_ENV=production
- VIRTUAL_HOST=www.example.com
- VIRTUAL_PORT=3011
此变量将特定于您指定的容器,并且不会在容器之间共享。
“docker-compose up”也不需要任何参数。
来自文档:
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
处理构建参数时,请在 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 及更高版本。玩得开心
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}
我试图找到批处理文件的解决方案,基于Rafael Delboni回答你可以在批处理文件中添加命令来调用powershell:
powershell $env:TEST="";docker-compose up ...
但相反,因为在批处理文件中调用 powershell 的成本很高,您可以在批处理文件中初始化 TEST 变量,然后调用 docker-compose 命令。 像这样的东西:
set TEST = ...
docker compose up ...
我对这个问题的解决方案是:
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 路径中的本地文件(请参阅卷)。