[标签]: sed怎么引用变量 不登录容器pod执行命令 the input device is not a TTY报错
问题详情的描述或方案目标的预期:
描述:开发需求是容器注册到zookeeper时需要被跨机器的其他dockers容器调用(宿主机之间非swarm集群而是独立的docker网络环境),无法调通注册到zookeeper的服务 这一行是问题描述
【解决方案】
整体思路:
一 运行pod的时候暴露出服务端口,映射到宿主机
二 将宿主机IP替换到pot容器内部的/etc/hosts文件最后一行POD_IP POD_HOSTNAME 改为 ECS_IP POD_HOSTNAME
三 服务启动后和dubbo通信,在没有配置DUBBO_IP_TO_REGISTRY和DUBBO_IP_TO_BIND等变量的情况下会采用本地/etc/hosts文件的解析配置进行注册
四 将相关操作写成脚本集成到Jenkins发布流程中实现自动发布
相关命令:
docker run -d --restart=always --name ${service_name} --env-file /env_files/test.env -v /data/app-logs:/logs -v /etc/localtime:/etc/localtime:ro -p 20881:20881 -p 18080:8080 ${image_name} java -Duser.timezone=GMT+8 -Dspring.profiles.active=test -jar -Xms512m -Xmx512m -Xmn384m app.jar;
sleep 6 && /opt/work/yunwei/scripts/jenkins-scripts.sh_for_lpxh_component-sms-log_docker-qa ${service_name}
上面引用脚本的内容:
docker cp ${1}:/etc/hosts /tmp/hosts
POD_IP=`cat /tmp/hosts |tail -1|awk '{print$1}'`
sed -i 's/'"${POD_IP}"'/192.168.100.140/' /tmp/hosts
docker cp /tmp/hosts ${1}:/hosts
docker exec -u 0 $1 bash -c "cp /hosts /etc/hosts"
DUBBO服务注册时绑定IP(服务对外被调用的IP)的规则:
默认情况下 Dubbo 会按照以下顺序来查找并绑定服务IP地址
1、查找环境变量中 DUBBO_IP_TO_BIND 属性配置的 IP 地址;
2、查找 dubbo.protocol.host 属性配置的 IP 地址,默认是空,如果没有配置或者IP地址不合法,则继续往下查找;
3、通过 LocalHost.getHostAddress 获取本机 IP 地址,如果获取失败,则继续往下查找;
4、如果配置了注册中心的地址,则使用 Socket 通信连接到注册中心的地址后,使用 for 循环通过 socket.getLocalAddress().getHostAddress() 扫描各个网卡获取网卡 IP 地址;
获取的 IP 地址并不是写入注册中心的地址。默认情况下,写入注册中心的 IP 地址优先选择环境变量中 DUBBO_IP_TO_REGISTRY 属性配置的 IP 地址。在这个属性没有配置的情况下,才会选取前面获得的 IP 地址并写入注册中心;
[sed引用变量方法]
方式1: 使用单引号,变量处使用单引号+双引号把变量包括起来
ARG=thnos
sed -i 's/rose/'"${ARG}"'/g' b.txt
方式2: 使用双引号,变量直接引用即可
ARG=thnos
sed -i "s/rose/${ARG}/g" name.txt
方式3: 使用单引号,变量直接引用,但是需要通过 eval 执行这个sed命令。eval会对后面Shell命令进行两遍扫描,如果第一遍扫描后,Shell命令是个普通命令,则执行此命令;如果Shell命令是含有变量的间接引用,则保证间接引用的语义
ARG=thnos
eval sed -i 's/rose/${ARG}/g' name.txt
[执行容器命令报the input device is not a TTY]
shell脚本执行容器命令报错"the input device is not a TTY"
容器重启过程中,可能会出现如题所示错误,原因是后台linux执行的时候没有终端设备,TTY一词源于Teletypes,或teletypewriters。
我们日常要与容器进行交互操作,就要加上"-it"这个参数,而在重启过重中或让脚本在后台运行的情况下,就没有可交互的终端,这就会引发如题所示错误,解决办法就是去掉“-it”这个参数。
总结:学会收集日常工作中的闪光碎片,你会受益匪浅。