我在docker-compose.yml文件下面。在command
部分中,我想先评估curl
表达式,然后再将命令传递给docker引擎,即应首先评估我的curl,然后再使用-ip 10.0.0.2
选项运行容器。 / p>
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 -X GET -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)
答案 0 :(得分:1)
命令行上的docker命令将起作用,因为该命令将由外壳而不是docker映像执行,因此它将得到解决。
docker-compose command
将覆盖默认命令(CMD)(请参阅https://docs.docker.com/compose/compose-file/#command),因此它将不会在容器启动之前执行,而是作为容器中的主要命令执行...
您可以执行以下操作:
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 -s http://169.254.169.254/latest/meta-data/local-ipv4)" docker-compose up
这将再次在外壳中运行它,并将其分配给名为IP witch的变量,该变量将在docker-compose up
命令期间可用。您可以将该命令放在shell脚本中以使其变得更容易。
答案 1 :(得分:0)
在互联网上搜索了此处发布的小时数和答案后,我终于找到了以下解决方案。有关为何有效的解释,请参阅@Ivonet答案。
我修改了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