我是Docker的新手。我正在编写一个docker-compose文件,它创建了2个容器, foo 和 bar ,共享一个卷数据:
services:
foo:
container_name: foo
build: ./foo
volumes:
- data:/var/lib/
bar:
container_name: bar
build: ./bar
volumes:
- data:/var/lib/
depends_on:
- foo
volumes:
data:
现在,我想使用环境变量 TAG 来标记容器和卷,以指定它是否适用于 test 或生产。我期待这样的事情:
services:
foo:
container_name: foo_${TAG}
build: ./foo
volumes:
- data_${TAG}:/var/lib/
bar:
container_name: bar_${TAG}
build: ./bar
volumes:
- data_${TAG}:/var/lib/
depends_on:
- foo
volumes:
data_${TAG}:
显然,由于包含data_${TAG}:
的最后一行,docker-compose不满意。
如何使用 TAG env变量命名我的音量?
答案 0 :(得分:1)
我不知道这是否可能,但这就是我所做的:
我有一个像这样的docker-compose.yml文件
services:
foo:
container_name: foo_${TAG}
build: ./foo
volumes:
- /var/lib/
bar:
container_name: bar_${TAG}
build: ./bar
volumes:
- /var/lib/
depends_on:
- foo
然后我创建一个包含
的文件docker-compose.override.ymlservices:
foo:
volumes:
- data_dev:/var/lib/
bar:
volumes:
- data_dev:/var/lib/
这样当启动docker-compose时,它将使用主文件并使用另一个文件来覆盖其值。
然后你应该有3个文件:
然后当你建立时,你可以选择那两个:
我希望它有所帮助
答案 1 :(得分:1)
如果您提前创建卷,则可以在外部卷名上使用此变量(请注意,compose中的引用是固定名称,但它指向可变外部卷名称):
$ cat docker-compose.volvar.yml
version: '2'
volumes:
data:
external:
name: test-data-${TAG}
services:
source:
image: busybox
command: /bin/sh -c 'echo From ${TAG} >>/data/common.log && sleep 10m'
environment:
- TAG
volumes:
- data:/data
target:
image: busybox
command: tail -f /data/common.log
depends_on:
- source
environment:
- TAG
volumes:
- data:/data
使用docker volume create
命令预先创建卷:
$ docker volume create test-data-dev
test-data-dev
$ docker volume create test-data-uat
test-data-uat
$ docker volume create test-data-stage
test-data-stage
这是运行它的一个例子(我没有使用不同的目录或更改项目名称,因此每次组合只更换我的容器,但我可以轻松地更改项目来运行它们同时具有相同的结果):
$ TAG=dev docker-compose -f docker-compose.volvar.yml up -d
Creating test_source_1
Creating test_target_1
$ docker logs test_target_1
From dev
$ TAG=uat docker-compose -f docker-compose.volvar.yml up -d
Recreating test_source_1
Recreating test_target_1
$ docker logs test_target_1
From uat
$ TAG=stage docker-compose -f docker-compose.volvar.yml up -d
Recreating test_source_1
Recreating test_target_1
$ docker logs test_target_1
From stage
$ # just to show that the volumes are saved and unique,
$ # rerunning uat generates a second line
$ TAG=uat docker-compose -f docker-compose.volvar.yml up -d
Recreating test_source_1
Recreating test_target_1
$ docker logs test_target_1
From uat
From uat