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

11 篇文章 0 订阅
1 篇文章 0 订阅

前言

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

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: Dockerfile 的 CMD 可以使用 shell 脚本,只需要在 Dockerfile 中指定 CMD 命令时,将 shell 脚本的路径作为参数传递给 CMD 命令即可。 例如,如果要在容器启动时执行名为 "start.sh" 的 shell 脚本,可以在 Dockerfile 中将 CMD 命令指定为: CMD ["sh", "/path/to/start.sh"] 其中 "/path/to/start.sh" 是 shell 脚本的路径。 注意,使用 shell 脚本时需要确保容器内已经安装了需要的 shell 环境(例如 bash、sh 等),否则可能会出现无法执行的情况。 ### 回答2: 在Dockerfile中,可以使用CMD命令来定义容器启动时要执行的命令。而如果需要在CMD中使用Shell脚本,可以将脚本内容写入一个单独的Shell文件,然后在Dockerfile中通过CMD命令来调用执行。 首先,创建一个shell脚本文件,例如test.sh,并写入需要执行的Shell命令,比如: ``` #!/bin/sh echo "Hello, Docker!" ``` 接下来,在Dockerfile使用CMD命令来调用执行这个Shell脚本: ``` FROM ubuntu:latest COPY test.sh / CMD ["/bin/sh", "test.sh"] ``` 解释一下这段Dockerfile的内容: - 第一行指定了基础镜像为最新版的Ubuntu。 - 第二行使用COPY命令将本地的test.sh文件复制到容器中的根目录下。 - 第三行使用CMD命令来执行test.sh文件,首先指定了要使用Shell解释器为/bin/sh,然后指定要执行的文件为test.sh。 保存并构建这个Docker镜像后,当使用该镜像启动容器时,CMD命令将会执行Shell脚本中的命令,输出"Hello, Docker!"。 通过在Dockerfile使用CMD命令来调用Shell脚本,可以方便地在容器启动时执行一系列的命令,以配置容器环境、安装软件等操作。 ### 回答3: 在Dockerfile中,可以使用CMD指令来指定容器在启动时所要运行的命令。以使用shell脚本作为CMD命令的例子来说明: 首先,创建一个名为"script.sh"的shell脚本文件,包含了要在容器启动时执行的命令。假设这个脚本包含了以下内容: ``` #!/bin/bash echo "Hello, Docker!" ``` 接下来,在Dockerfile使用CMD指令来调用该脚本文件。假设Dockerfile的内容如下: ``` FROM ubuntu:latest COPY script.sh /app/ WORKDIR /app CMD ["bash", "script.sh"] ``` 上述Dockerfile首先基于最新的Ubuntu镜像进行构建。然后将主机上的"script.sh"文件复制到容器中的"/app/"目录下,并将"/app/"设置为工作目录。最后,使用CMD指令来调用"bash"命令执行"script.sh"脚本。 构建镜像并运行容器时,容器会自动执行CMD指定的命令。在这个例子中,容器启动后会执行"script.sh"脚本中的内容,即打印"Hello, Docker!"。 总结:通过在Dockerfile使用CMD指令,可以调用shell脚本作为容器启动时的命令。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值