docker使用dockerfile和shell脚本,动态参数控制

  • Post author:
  • Post category:其他




前言

最近在写搞项目中的测试环境远程debug,需要修改一下dockerfile中的shell脚本配置启动java程序中的参数,所以有在研究dockerfile和shell脚本



shell中传入参数

shell脚本,名称为start.up

#!/bin/bash
a=$1
b=$2
if [ "$a" == "1" ];then
echo "a=1"
else
echo "a!=1"	
fi
if [ "$b" == "2" ];then
echo "b=2"
else
echo "b!=2"	
fi

linux命令

[root@VM_0_8_centos shellTest]# sh startup.sh 
a!=1
b!=2
[root@VM_0_8_centos shellTest]# sh startup.sh 1 2
a=1
b=2

可以看到。这样shell脚本中获得了从外部传入的参数



docker中获得参数并且传入到shell中

dockerfile

FROM centos:7

COPY startup.sh /opt

RUN chmod +x /opt/startup.sh

ARG a
ARG b
ENV a=${a} \
    b=${b}

CMD /opt/startup.sh ${a} ${b}

linux命令

[root@VM_0_8_centos shellTest]# docker build -ttest:1.6 --build-arg a=1 --build-arg b=2 .
[root@VM_0_8_centos shellTest]# docker run -ti --rm=true test:1.6
a=1
b=2
[root@VM_0_8_centos shellTest]# docker run -ti -e a=2 -e b=3 --rm=true test:1.6
a!=1
b!=2
[root@VM_0_8_centos shellTest]# docker build -ttest:1.7  .
[root@VM_0_8_centos shellTest]# docker run -ti -e a=1 -e b=2 --rm=true test:1.7
a=1
b=2

就可以看到外部参数被传入了



修改

后面我才知道,当docker run -e的时候其实就是在容器之中写入环境变量,dodckerfile中ENV也是写入环境变量,而shell脚本其实可以直接读取到环境变量的参数,不需要sh启动的时候再传入参数这种比较繁琐的操作了

修改后的dockerfile

FROM centos:7

COPY startup.sh /opt

RUN chmod +x /opt/startup.sh

CMD /opt/startup.sh

修改后的shell脚本

#!/bin/bash
if [ ${a} == "1" ];then
echo "a=1"
else
echo "a!=1"	
fi
if [ ${b} == "2" ];then
echo "b=2"
else
echo "b!=2"	
fi

其中



a

,

{a},







a



,





{b}就是直接读取环境变量的a,b两个参数的数值

linux运行参数

[root@VM_0_8_centos shellTest]# docker build -ttest:1.9  .
[root@VM_0_8_centos shellTest]# docker run -ti -e a=1 -e b=2 --rm=true test:1.9
a=1
b=2



shell中的一个有趣的用法

shell脚本说明

:-
${a:-1} #获得环境变量a的值,如果没有,则设置默认值为1

修改后的shell脚本

#!/bin/bash
if [ ${a:-1} == "1" ];then
echo "a=1"
else
echo "a!=1"	
fi
if [ ${b} == "2" ];then
echo "b=2"
else
echo "b!=2"	
fi

linux命令

[root@VM_0_8_centos shellTest]# docker run -ti -e -e b=2 --rm=true test:2.0
[root@VM_0_8_centos shellTest]# docker run -ti -e b=2 --rm=true test:2.0
a=1
b=2

可以看到,这次我docker run的时候没有设置a环境变量,但是由于默认值的存在,还是给a设置了一个1的默认值。所以就有很多可控制的地方了



:-的用处

回到我们开始的地方,我现在需要做一个配置,在测试环境开启远程debug,在其他环境不开启。那么就可以在启动的shell脚本中设置这么一个参数,-jar 启动的时候传入这个参数,并且设置默认值为空,如果我需要开启远程debug,就可以在docker run -e 的时候把远程debug的参数穿进去就可以进行是否开启远程debug的控制了,置于远程debug的命令,可以参照我上一篇

dockerfile开启spring boot远程debug



版权声明:本文为qq_33562996原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。