前言
最近在写搞项目中的测试环境远程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