我正在尝试将容器的主机名设置为在 AWS EC2 中的 docker compose v3 中hostname: '{{.Node.Hostname}}'
。
它失败了,因为Error response from daemon: rpc error: code = 3 desc = expanding hostname failed: template: expansion:1:7: executing "expansion" at <.Node.Hostname>: can't evaluate field Hostname in type struct { ID string }
.
以下是版本详细信息,
Client:
Version: 17.06.2-ce
API version: 1.30
Go version: go1.8.4
Git commit: 3dfb8343b139d6342acfd9975d7f1068b5b1c3d3
Built: Fri Nov 10 00:50:37 2017
OS/Arch: linux/amd64
Server:
Version: 17.06.2-ce
API version: 1.30 (minimum version 1.12)
Go version: go1.8.4
Git commit: 402dd4a/17.06.2-ce
Built: Fri Nov 10 00:51:08 2017
OS/Arch: linux/amd64
Experimental: false
根据 https://docs.docker.com/compose/compose-file/,17.06.+ 与 docker-compose v3 兼容。
我怎样才能使这个模板工作?我需要升级码头工人吗?谢谢。
这现在适用于 Docker 的撰写文件和 v17.12(2017 年 12 月稳定版(,但仅适用于与 Swarm Stack 一起使用时。
我认为您正在使用 Swarm,所以只需更新您的 docker 版本,您应该很好,但这里有更多信息供其他人使用,以防他们只是尝试单节点docker-compose up
,这不适用于模板。
docker-compose
不像 Swarm 那样解释 go 模板。
此外,.Node.Hostname
是特定于 Swarm 的标签,因此您不能将其与单个服务器上的 docker-compose up
一起使用,该服务器上无权访问该标签。
只是为了验证,当我使用此撰写文件时:
version: "3.4"
services:
nginx:
image: nginx
hostname: '{{.Node.Hostname}}'
在 docker 撰写中,这就是我得到的:
docker-compose up -d
docker-compose exec nginx hostname
{{.Node.Hostname}}
然后,如果我在 Swarm Stack 中使用该文件:
docker stack deploy -c docker-compose.yml hn
# find the node and container ID of that service task
# found them on node 1 with hostname "swarm1"
docker exec 0a087 hostname
swarm1
如果需要在单个节点中使用 docker-compose
并将主机名放入撰写文件中,可以使用变量替换,然后将主机名设置为变量,然后docker-compose up
将替换撰写文件中的变量。