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

本文详细讲解了如何在Dockerfile和Shell脚本中实现参数的传递与使用,包括通过ARG和ENV指令在Dockerfile中定义参数,以及在Shell脚本中通过环境变量读取这些参数的方法。此外,还介绍了如何利用默认值增强参数控制的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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

### 创建带GUI的Shell脚本 为了在Docker容器内部创建并运行带有图形用户界面(GUI)的应用程序,可以通过特定配置使GUI应用显示到主机系统的显示器上。这涉及到几个方面的工作: #### 配置X11转发 对于Linux系统来说,最常用的方法是利用X Window System (X11),它允许应用程序在一个机器上运行而在另一个机器上展示窗口。为此,在启动容器时需设置环境变量`DISPLAY`指向宿主机,并挂载必要的Unix socket文件以便通信。 ```bash docker run -it --rm \ -e DISPLAY=$DISPLAY \ -v /tmp/.X11-unix:/tmp/.X11-unix \ my_gui_app_image ``` 此命令片段设置了DISPLAY环境变量并将/tmp/.X11-unix目录映射到了容器内[^3]。 #### 编写Shell脚本来启动GUI应用 下面是一个简单的例子,展示了如何编写一个用于启动GNOME Calculator(计算器)作为示例GUI应用的shell脚本: ```bash #!/bin/bash # Ensure the script exits on any error inside it. set -e echo "Starting GUI application..." if [[ "$DISPLAY" == "" ]]; then echo "Error: No display specified." exit 1 fi gnome-calculator & wait $! ``` 保存上述代码至名为`start-gui-app.sh`的文件中,并确保给予可执行权限: ```bash chmod +x start-gui-app.sh ``` 然后可以在构建Dockerfile时COPY这个脚本进去,并将其设为ENTRYPOINT或CMD指令的一部分来自动执行。 #### 构建支持GUI的Docker镜像 为了让容器内的GUI应用正常工作,还需要基于包含所需桌面库的基础镜像来创建自定义镜像。例如,可以从Ubuntu官方仓库获取预安装了基本Xorg依赖项的版本。 ```dockerfile FROM ubuntu:latest RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get install -y \ gnome-calculator \ xvfb \ fluxbox \ xterm \ wget \ curl \ git \ vim \ sudo \ software-properties-common \ build-essential \ python3-pip \ libgl1-mesa-dev \ mesa-utils \ ffmpeg \ vnc4server \ tigervnc-standalone-server \ xfce4 \ xfce4-goodies \ tightvncserver \ openssh-server \ firefox-esr \ && rm -rf /var/lib/apt/lists/* WORKDIR /root/ COPY ./start-gui-app.sh . ENV DISPLAY=:0.0 CMD ["./start-gui-app.sh"] ``` 这段Dockerfile不仅包含了之前提到的shell脚本,还增加了许多其他软件包以增强用户体验支持更多类型的GUI应用。注意这里也指定了默认使用的屏幕号(`DISPLAY=:0.0`)。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值