我希望能够在docker-compose中使用env变量。Yml,在docker-compose up时传入的值。这就是例子。
今天我使用的是基本的docker run命令,该命令包含在我自己的脚本中。 有没有一种方法来实现它与撰写,没有任何这样的bash包装?
proxy:
hostname: $hostname
volumes:
- /mnt/data/logs/$hostname:/logs
- /mnt/data/$hostname:/data
我希望能够在docker-compose中使用env变量。Yml,在docker-compose up时传入的值。这就是例子。
今天我使用的是基本的docker run命令,该命令包含在我自己的脚本中。 有没有一种方法来实现它与撰写,没有任何这样的bash包装?
proxy:
hostname: $hostname
volumes:
- /mnt/data/logs/$hostname:/logs
- /mnt/data/$hostname:/data
当前回答
这是为Docker v20编写的,使用Docker compose v2命令。
I was having a similar roadblock and found that the --env-file parameter ONLY works for docker compose config command. On top of that using the docker compose env_file variable, still forced me to repeat values for the variables, when wanting to reuse them in other places than the Dockerfile such as environment for docker-compose.yml. I just wanted one source of truth, my .env, with the ability to swap them per deployment stage. So here is how I got it to work, basically use docker compose config to generate a base docker-compose.yml file that will pass ARG into Dockerfile's.
。local。这是你的。env,我把我的。env分成了不同的部署。
DEVELOPMENT=1
PLATFORM=arm64
docker-compose.config。yml -这是我的核心docker合成文件。
services:
server:
build:
context: .
dockerfile: docker/apache2/Dockerfile
args:
- PLATFORM=${PLATFORM}
- DEVELOPMENT=${DEVELOPMENT}
environment:
- PLATFORM=${PLATFORM}
- DEVELOPMENT=${DEVELOPMENT}
现在不幸的是,我需要传递两次变量,一次用于Dockerfile,另一次用于environment。然而,它们仍然来自单一来源。local。env这样至少我不需要重复值。
然后,我使用docker compose config生成一个半成品docker-compose.yml。这让我传入我的同伴override docker-compose.local。Yml表示发生最终部署的地方。
docker compose --env-file=.local.env -f docker-compose.config.yml config > docker-compose.yml
这将允许我的Dockerfile访问.env变量。
FROM php:5.6-apache
# Make sure to declare after FROM
ARG PLATFORM
ARG DEVELOPMENT
# Access args in strings with $PLATFORM, and can wrap i.e ${PLATFORM}
RUN echo "SetEnv PLATFORM $PLATFORM" > /etc/apache2/conf-enabled/environment.conf
RUN echo "SetEnv DEVELOPMENT $DEVELOPMENT" > /etc/apache2/conf-enabled/environment.conf
然后从docker-compose中传递.env变量。yml到Dockerfile,然后传递到我的Apache HTTP服务器,它传递到我的最终目的地,PHP代码。
我的下一步是从部署阶段传入我的docker合成重写。
docker-compose.local。yml -这是我的docker重写。
services:
server:
volumes:
- ./localhost+2.pem:/etc/ssl/certs/localhost+2.pem
- ./localhost+2-key.pem:/etc/ssl/private/localhost+2-key.pem
最后,运行docker compose命令。
docker compose -f docker-compose.yml -f docker-compose.local.yml up --build
请注意,如果你在你的.env文件中改变了任何东西,你将需要重新运行docker compose config并添加——build for docker compose up。因为构建是缓存的,所以影响很小。
因此,对于我的最后一个命令,我通常运行:
docker compose --env-file=.local.env -f docker-compose.config.yml config > docker-compose.yml; docker compose --env-file=.local.env -f docker-compose.yml -f docker-compose.local.yml up --build
其他回答
将env添加到。env文件中
如
VERSION=1.0.0
然后将其保存到deploy.sh
INPUTFILE=docker-compose.yml
RESULT_NAME=docker-compose.product.yml
NAME=test
prepare() {
local inFile=$(pwd)/$INPUTFILE
local outFile=$(pwd)/$RESULT_NAME
cp $inFile $outFile
while read -r line; do
OLD_IFS="$IFS"
IFS="="
pair=($line)
IFS="$OLD_IFS"
sed -i -e "s/\${${pair[0]}}/${pair[1]}/g" $outFile
done <.env
}
deploy() {
docker stack deploy -c $outFile $NAME
}
prepare
deploy
我有一个简单的bash脚本,我为此创建,这只是意味着在使用之前在你的文件上运行它: https://github.com/antonosmond/subber
基本上只要创建你的合成文件使用双花括号表示环境变量,例如:
app:
build: "{{APP_PATH}}"
ports:
- "{{APP_PORT_MAP}}"
双花括号中的任何内容都将被同名的环境变量替换,因此如果我设置了以下环境变量:
APP_PATH=~/my_app/build
APP_PORT_MAP=5000:5000
运行subber docker-compose。Yml生成的文件看起来像这样:
app:
build: "~/my_app/build"
ports:
- "5000:5000"
docker-compose现在似乎对文件中的默认环境变量提供了本地支持。
你所需要做的就是在一个名为.env的文件中声明你的变量,它们将在docker-compose.yml中可用。
例如,对于包含以下内容的.env文件:
MY_SECRET_KEY=SOME_SECRET
IMAGE_NAME=docker_image
你可以在docker-compose中访问你的变量。Yml或将它们转发到容器中:
my-service:
image: ${IMAGE_NAME}
environment:
MY_SECRET_KEY: ${MY_SECRET_KEY}
最好的方法是在docker-compose之外指定环境变量。yml文件。您可以使用env_file设置,并在同一行中定义您的环境文件。然后再次进行docker-compose,应该使用新的环境变量重新创建容器。
这是我的docker-compose。Yml看起来像:
services:
web:
env_file: variables.env
注意: docker-compose期望env文件中的每一行都是VAR=VAL格式。避免在.env文件中使用export。此外,.env文件应该放在执行docker-compose命令的文件夹中。
使用.env文件在docker-compse.yml中定义动态值。不管是port还是其他值。
示例docker-compose:
testcore.web:
image: xxxxxxxxxxxxxxx.dkr.ecr.ap-northeast-2.amazonaws.com/testcore:latest
volumes:
- c:/logs:c:/logs
ports:
- ${TEST_CORE_PORT}:80
environment:
- CONSUL_URL=http://${CONSUL_IP}:8500
- HOST=${HOST_ADDRESS}:${TEST_CORE_PORT}
在.env文件中,你可以定义这些变量的值:
CONSUL_IP=172.31.28.151
HOST_ADDRESS=172.31.16.221
TEST_CORE_PORT=10002