lxc start之后获取容器的IP地址

时间:2018-10-31 22:28:44

标签: lxd

我在云提供商的cloud-init中运行以下脚本。它从网络上的另一个主机上抓取一个容器,启动它,然后尝试将主机上的端口转发到该容器:

lxc init ...
lxc remote add gateway 10.132.98.1:8099 --accept-certificate --password securpwd
lxc copy gateway:build-slave build-slave
lxc start build-slave
CONTAINER_IP=$(lxc list "build-slave" -c 4 | awk '!/IPV4/{ if ( $2 != "" ) print $2}')
iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 2200 -j DNAT --to ${CONTAINER_IP}

唯一的问题是lxc start返回与IPV4信息可用之间存在任意延迟。我当前的解决方案是在sleep 5s命令后添加lxc start,但是我担心如果服务器处于负载状态,则实际上可能要花5秒钟以上的时间才能初始化容器。

有没有不依赖于任意等待时间的更好的解决方案?

1 个答案:

答案 0 :(得分:0)

如劳伦斯在评论中指出,LXD提供了可以在容器上设置的“代理” device。这样,我不必知道容器的IP地址即可设置正确的IPTABLES条目。当指定的容器启动时,LXD会为我设置代理规则。

我这样配置:

DROPLET_PUB_IP=$(ip -f inet addr show ens3 | sed -En -e 's/.*inet ([0-9.]+).*/\1/p')
lxc config device add build-slave ssh-slave proxy listen=tcp:${DROPLET_PUB_IP}:2200 connect=tcp:localhost:22