正在检索"lxc启动"之后的容器IP地址



我在云提供程序的cloudinit中运行了以下脚本。它从我的网络上的另一台主机上获取一个容器,启动它,然后尝试将主机上的端口转发到容器:

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信息可用之间存在任意延迟。我目前的解决方案是在lxc start命令之后添加sleep 5s,但我担心,如果我的服务器处于负载状态,那么初始化容器的时间可能会超过5秒。

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

正如Lawrence在评论中指出的,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

最新更新