【工作日志分享--sed引用变量用法-不登录容器执行命令-容器zk注册服务时使用宿主机固定IP】

 

 

 

 

 

[标签]: 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”这个参数。

  

  

  

总结:学会收集日常工作中的闪光碎片,你会受益匪浅。

 

 

 

百度一下    谷歌翻译

 

 

 

 

 

 

【书君方案】 简洁、完整、漂亮、记忆深刻

 

 

 

 

 

 

©2022 BLUBN.HonL   京ICP备15053931号   书君   bookfooked.com V1.1