docker启动容器覆盖镜像中的命令

背景

1.镜像是其他人提供的,修改镜像比较麻烦

2.镜像中的变量不足以满足当前业务

3.镜像中的启动命令不足以满足当前业务

覆盖前

Haskell 复制代码
#通过以下命令,查看镜像中的参数和启动命令
docker inspect

镜像中的命令是写死的,需要覆盖调镜像中的命令

覆盖

由图中可以看到是一个sh命令,通过--entrypoint 找到入口,并在镜像之后修改

设置的命令必须在镜像名称之后

Haskell 复制代码
docker run -d --network=host --name cName \
 --entrypoint sh \
 -e JAVA_OPTS="-Xms1024m -Xmx1024m -Dspring.profiles.active=dev -Dserver.port=5566 -Duser.timezone=GMT+8" \
 -v /etc/hosts:/etc/hosts \
 -v `pwd`:/apps/ \
 -v /etc/localtime:/etc/localtime --restart=unless-stopped image:1.0 \
 -c 'java -jar $JAVA_OPTS app.jar'

覆盖后

PS: 如果命令中 -c "java -jar $JAVA_OPTS " 用了双引号,宿主机的 Shell 会先解析 $JAVA_OPTS (宿主机没有这个环境变量,直接替换为空),容器内实际执行的是 java -jar (只有空参数)---这个要注意(要是用单引号,才能使用前面使用的变量)
同时也可以是用--entrypoint java作为修改入口,比如在需要修改镜像中指定的jar路径和名称的时候,命令如下:

Haskell 复制代码
docker run -d --network=host --name cName \
 --entrypoint java \
 -e JAVA_OPTS="-Xms1024m -Xmx1024m -Dspring.profiles.active=dev -Dserver.port=5566 -Duser.timezone=GMT+8" \
 -v /etc/hosts:/etc/hosts \
 -v `pwd`:/apps/ \
 -v /etc/localtime:/etc/localtime --restart=unless-stopped image:1.0 \
 -jar '$JAVA_OPTS app.jar'

这个时候,就仅会修改 java -jar之后的相关命令
完整的容器启动脚本

Haskell 复制代码
#!/bin/bash
# 查询当前路径下 用jar结尾的文件并根据最后修改时间排序,获取文件名
#readonly c_name=$(ls *.jar -lt |head -n 1 | awk '{print substr($9,1,length($9)-4)}')
readonly c_name="容器名称"
readonly port=2233
readonly profiles_active=dev
readonly image_name="镜像版本"
docker_run(){
    docker rm -f ${c_name} ;
    docker run -d --network=host --name ${c_name} \
      --entrypoint sh \
      -e JAVA_OPTS="-Xms1024m -Xmx1024m -Dspring.profiles.active=${profiles_active} -Dserver.port=${port} -Duser.timezone=GMT+8" \
      -e JAR_NAME="$1" \
      -v /etc/hosts:/etc/hosts \
      -v `pwd`:/apps/ \
      -v /etc/localtime:/etc/localtime --restart=unless-stopped ${image_name} \
      -c 'java -jar $JAVA_OPTS /apps/$JAR_NAME'
}
if [ -n "$1" ]; then
  docker_run $1
else
 echo "没有指定默认的启动jar包-执行按照最后修改时间的最后一个jar文件-->"$(ls *.jar -lt |head -n 1| awk '{print $9}')
 docker_run $(ls *.jar -lt |head -n 1| awk '{print $9}')
fi

后记

遇到此问题多次,每次都没有顺手记录,导致需要不停的尝试,本次记录备查,需要注意的点:
1. 变量参数,要在指定镜像名称之前设置才能生效

2.覆盖的命令必须在指定镜像之后才能生效

3.必须要要找到合适的覆盖入口

4.最后的命令想要使用之前的参数,需要使用单引号,不能使用双引号

相关推荐
invicinble3 小时前
对linux形成认识
linux·运维·服务器
小Pawn爷3 小时前
14.VMmare安装ubuntu
linux·运维·ubuntu
技术路上的探险家3 小时前
8 卡 V100 服务器:基于 vLLM 的 Qwen 大模型高效部署实战
运维·服务器·语言模型
有谁看见我的剑了?4 小时前
介绍一款 测试 DNS解析成功率的网站
运维
半桔4 小时前
【IO多路转接】高并发服务器实战:Reactor 框架与 Epoll 机制的封装与设计逻辑
linux·运维·服务器·c++·io
engchina4 小时前
WSL Ubuntu で Kubernetes v1.34.2 + Docker 環境を構築する
ubuntu·docker·kubernetes
HABuo4 小时前
【linux文件系统】磁盘结构&文件系统详谈
linux·运维·服务器·c语言·c++·ubuntu·centos
Howrun7775 小时前
关于Linux服务器的协作问题
linux·运维·服务器
yunfuuwqi6 小时前
OpenClaw✅真·喂饭级教程:2026年OpenClaw(原Moltbot)一键部署+接入飞书最佳实践
运维·服务器·网络·人工智能·飞书·京东云
迎仔6 小时前
C-算力中心网络隔离实施方法:怎么搞?
运维·网络