docker compose命令数组中的求值表达式
我有下面的docker-compose.yml文件。在docker compose命令数组中的求值表达式,docker,docker-compose,registrator,Docker,Docker Compose,Registrator,我有下面的docker-compose.yml文件。在命令部分中,我希望在将命令传递给docker engine之前计算curl表达式,即首先计算我的curl,然后使用-ip 10.0.0.2选项运行我的容器 version: '2' services: registrator: image: gliderlabs/registrator:v7 container_name: registrator volumes: - /var/run/docker.s
命令
部分中,我希望在将命令传递给docker engine之前计算curl
表达式,即首先计算我的curl,然后使用-ip 10.0.0.2
选项运行我的容器
version: '2'
services:
registrator:
image: gliderlabs/registrator:v7
container_name: registrator
volumes:
- /var/run/docker.sock:/tmp/docker.sock
command: ['-ip', '$$(curl -X GET -s http://169.254.169.254/latest/meta-data/local-ipv4)']
然而,这并没有被评估,我的选项作为-ip$(curl-xget-s)传递http://169.254.169.254/latest/meta-data/local-ipv4)
但是,相应的docker run命令正确地计算表达式,并且我的容器正确地以-ip 10.0.0.2
选项开始:
docker run -v /var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator:v7 -ip $(curl -X GET -s http://169.254.169.254/latest/meta-data/local-ipv4)
命令行上的docker命令将起作用,因为该命令将由shell而不是docker映像执行,因此它将被解析 docker compose
命令
将覆盖默认命令(CMD)(请参阅),因此它不会在容器启动之前执行,而是作为容器中的主命令执行
你可以这样做:
version: '2'
services:
registrator:
image: gliderlabs/registrator:v7
container_name: registrator
volumes:
- /var/run/docker.sock:/tmp/docker.sock
command: ['-ip', '${IP}']
并使用以下工具运行它:
IP=“$(curl-X GET-shttp://169.254.169.254/latest/meta-data/local-ipv4)“docker组装
这将在shell中再次运行它,并将其分配给名为IP witch的变量,该变量将在
docker compose up
命令期间可用。您可以将该命令放在shell脚本中以使其更简单。在互联网上搜索了数小时并在此处发布了答案后,我最终决定采用以下解决方案。有关此操作的解释,请参阅@Ivonet-answer
我修改了Dockerfile
,以便在容器启动时运行脚本
FROM gliderlabs/registrator:v7
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh && \
apk update && \
apk add curl
ENTRYPOINT ["/entrypoint.sh"]
脚本entrypoint.sh
也非常简单。它首先检查是否可以调用端点。成功的响应将触发容器以正确的IP地址启动,而不成功的响应(用于本地测试)将不会设置任何值
#!/bin/sh
LOCAL_IP=$(curl -s --connect-timeout 3 169.254.169.254/latest/meta-data/local-ipv4)
if [ $? -eq 0 ]; then
/bin/registrator -ip $LOCAL_IP $@
else
/bin/registrator $@
fi
谢谢你的回答。它确实帮助我更好地理解了Docker。@Rash我的荣幸:-)