性能测试持续学习 Docker 新建镜像,启动 POD

本文介绍了如何在性能测试中运用Docker,包括在Linux环境下安装Docker,构建Docker镜像,推送到仓库,以及使用已有镜像启动Pod进行测试环境的快速部署。

目录

前言:

1、构建镜像

2、使用已有镜像启动 Pod


前言:

在进行性能测试时,持续学习Docker的使用可以帮助测试团队更好地管理测试环境和资源。通过使用Docker,可以轻松创建和管理测试环境的镜像,并通过启动POD来快速部署和运行性能测试。

主要步骤

1、构建镜像

机器:linux

安装 Docker
yum -y install docker

启动 docker
service docker start

查看 docker 状态
systemctl status docker

登录公司仓库地址
docker login --username=用户名 url

docker images

新建 DockerFile
FROM /centos7-jdk8:0.2.2
RUN wget http://mirror.23media.de/apache/jmeter/binaries/apache-jmeter-5.0.tgz &&\
tar xzvf apache-jmeter-5.0.tgz &&\
mv apache-jmeter-5.0 ./jmeterHome &&\
cp -R jmeterHome /usr/local/bin &&\
export PATH=jmeterHome/bin:$PATH &&\
export CLASSPATH=jmeterHome/lib/ext/ApacheJMeter_

<think>我们讨论了如何修改Docker镜像的Entrypoint并增加操作。根据引用,用户提到了两种方法:覆盖Entrypoint(引用[1])和修改Entrypoint以改变SpringBoot激活环境(引用[2])。用户现在想了解在启动服务时如何修改Entrypoint并增加一些操作。 解决方案: 1. 覆盖Entrypoint:在运行容器时使用`--entrypoint`参数覆盖整个Entrypoint。 2. 在原有Entrypoint的基础上增加操作:可以通过在`docker run`命令中传递新的命令参数(CMD部分)来实现,但这需要镜像的原始Entrypoint能够接收参数。或者,使用脚本包装器。 详细步骤: 方法1:完全覆盖Entrypoint(适用于需要完全替换启动命令的情况) docker run -it --entrypoint /bin/bash your_image:tag 方法2:在原有Entrypoint基础上追加操作(通过传递CMD参数) 如果原始镜像Dockerfile中使用了`ENTRYPOINT`和`CMD`的组合,那么我们可以通过传递新的CMD来改变参数。但注意,如果Entrypoint是一个脚本,我们可以通过传递参数来改变其行为。 方法3:使用脚本包装器(推荐) 创建一个新的启动脚本,在其中先执行我们想要增加的操作,然后再执行原始Entrypoint。然后覆盖Entrypoint为这个新脚本。 步骤示例(方法3): 步骤1:创建一个新的启动脚本(例如`new_entrypoint.sh`) ```bash #!/bin/sh # 执行新增操作 echo "Performing additional operations..." # 然后执行原始Entrypoint exec /original/entrypoint.sh "$@" ``` 步骤2:在Dockerfile中复制这个新脚本并设置Entrypoint ```Dockerfile COPY new_entrypoint.sh /new_entrypoint.sh RUN chmod +x /new_entrypoint.sh ENTRYPOINT ["/new_entrypoint.sh"] ``` 步骤3:构建新镜像并运行 方法4:运行时覆盖并传递参数(不修改镜像) 如果只是想在启动时先执行一些命令,然后再进入原始Entrypoint,可以使用以下技巧: ```bash docker run --entrypoint /bin/sh your_image:tag -c "echo 'do something'; exec /original/entrypoint.sh param1 param2" ``` 注意:这里使用了`exec`来替换当前shell进程,保证原始Entrypoint成为PID 1。 根据引用[1],我们可以直接使用`--entrypoint`覆盖,然后指定新的命令(如`/bin/bash`)来进入容器手动操作。但如果是生产环境,我们可能需要自动化的方式。 结合用户需求:在启动服务时修改Entrypoint并增加一些操作,我们可以推荐方法3(构建新镜像)或方法4(在运行时使用shell命令)。 示例:在运行容器时增加操作(方法4) ```bash docker run -d --entrypoint /bin/sh your_image:tag -c "echo 'Performing pre-start operations...'; exec ./your_entrypoint.sh" ``` 这里假设原始镜像的Entrypoint是`./your_entrypoint.sh`,我们在启动容器时先执行一个echo命令,然后通过exec执行原始Entrypoint。 注意事项: - 使用`exec`是为了避免产生额外的shell进程,这样可以使原始Entrypoint成为容器的主进程(PID 1),从而正确接收信号(如SIGTERM)。 - 如果原始Entrypoint是一个脚本,我们需要知道它在镜像中的路径。 如果用户需要修改的是SpringBoot激活环境(如引用[2]),我们可以通过传递CMD参数来覆盖: ```bash docker run -d your_image:tag --spring.profiles.active=prod ``` 这要求原始镜像的Entrypoint能够接收参数,并且没有在Entrypoint中固定参数。 因此,总结修改Entrypoint并增加操作的方法: - 覆盖Entrypoint并执行自定义命令(运行时) - 通过传递CMD参数(如果Entrypoint支持) - 构建新镜像,编写包装脚本(长期方案) 引用说明: 我们在回答中参考了覆盖Entrypoint的方法(引用[1])和修改启动参数的需求(引用[2]),以及容器运行的基本命令(引用[3])。 相关问题: 1. 如何传递环境变量给Docker容器中的应用程序? 2. 在Docker容器中如何优雅地停止服务? 3. Docker Entrypoint和CMD的区别是什么? 4. 如何调试Docker容器启动过程? </think>### Docker 镜像修改 Entrypoint 并增加操作的完整指南 当需要在 Docker 镜像启动服务时修改 Entrypoint 并增加额外操作,以下是四种实用方法: --- #### 1. **运行时覆盖 Entrypoint(临时修改)** 直接在 `docker run` 命令中通过 `--entrypoint` 参数覆盖原有 Entrypoint: ```bash # 覆盖为自定义命令(示例:先执行数据备份再启动服务) docker run -d \ --name my_container \ --entrypoint /bin/sh \ your_image:tag \ -c "mkdir -p /backup && cp /app/config/* /backup/ && ./original_entrypoint.sh" ``` **特点**: - 即时生效,不修改原镜像 - 适合临时诊断或测试场景 - 命令格式必须完整(需指定 shell 解释器)[^1] --- #### 2. **创建包装脚本(永久修改)** 构建新镜像时添加包装脚本,扩展原始 Entrypoint: ```Dockerfile # 新建包装脚本 FROM your_base_image:tag COPY wrapper.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/wrapper.sh # 覆盖原始 Entrypoint ENTRYPOINT ["/usr/local/bin/wrapper.sh"] ``` `wrapper.sh` 脚本内容示例: ```bash #!/bin/sh # 新增前置操作 echo "[$(date)] Starting initialization..." > /var/log/init.log /app/bin/prepare-env.sh # 自定义初始化脚本 # 执行原始 Entrypoint exec ./original_entrypoint.sh "$@" ``` **优势**: - 可扩展复杂初始化逻辑 - 保持原始启动命令不变 - 通过 `exec` 确保新进程继承 PID 1[^3] --- #### 3. **环境变量注入(灵活配置)** 通过环境变量控制 Entrypoint 行为: ```dockerfile # Dockerfile 修改 ENTRYPOINT ["/bin/sh", "-c", "./start-service.sh ${EXTRA_ARGS}"] ``` 启动时注入变量: ```bash # 增加额外启动参数 docker run -d \ -e EXTRA_ARGS="--preflight-check --log-level=debug" \ your_image:tag ``` **适用场景**: - 动态调整启动参数(如日志级别、环境配置) - 兼容 Kubernetes 环境变量注入 - 避免硬编码敏感参数[^2] --- #### 4. **多阶段 Entrypoint(模块化操作)** 拆分 Entrypoint 为多个可执行单元: ```dockerfile # Dockerfile COPY --chmod=755 stage-*.sh /scripts/ ENTRYPOINT ["/bin/sh", "-c", "/scripts/stage-1.sh && /scripts/stage-2.sh && /scripts/run-main.sh"] ``` 阶段脚本示例: ```bash # stage-1.sh:前置操作 #!/bin/sh /app/bin/validate-config.sh # run-main.sh:主服务启动 #!/bin/sh exec ./original_entrypoint.sh ``` **最佳实践**: - 每个脚本专注单一功能 - 便于调试和维护 - 支持条件执行(如 `[ -f /config/file ] && stage-3.sh`) --- ### 操作对比表 | **方法** | 适用场景 | 持久性 | 复杂度 | 容器信号处理 | |----------------------|-----------------------------|--------|--------|--------------| | 运行时覆盖 | 临时调试/快速验证 | ✘ | 低 | 需手动处理 | | 包装脚本 | 生产环境定制启动流程 | ✔ | 中 | 自动继承 | | 环境变量注入 | 动态参数配置 | ✔ | 低 | 自动继承 | | 多阶段 Entrypoint | 复杂初始化流程 | ✔ | 高 | 自动继承 | --- ### 关键注意事项 1. **信号传递问题** - 必须使用 `exec` 启动最终进程(如 `exec ./main.sh`) - 确保 PID 1 进程正确处理 SIGTERM 等信号 2. **错误处理** ```bash # 在包装脚本中添加错误检测 ./pre-start.sh || { echo "Pre-start failed"; exit 1; } exec ./main.sh ``` 3. **上下文共享** - 前置操作生成的文件需写入持久化卷 - 避免在临时文件系统操作关键数据 4. **Kubernetes 集成** ```yaml # K8s Pod 配置示例 command: ["/bin/sh", "-c"] args: - "prepare-env.sh && exec ./main.sh --port=8080" ``` --- ### 典型应用场景 **场景1:数据库启动前执行迁移** ```bash docker run -d \ --entrypoint /bin/sh \ postgres:14 \ -c "alembic upgrade head && exec docker-entrypoint.sh postgres" ``` **场景2:动态生成配置文件** ```dockerfile # Dockerfile ENTRYPOINT ["/bin/sh", "-c", "envsubst < /template.conf > /app.conf && ./start.sh"] ``` 通过灵活组合上述方法,可实现安全可靠的 Entrypoint 扩展,满足不同环境的初始化需求[^1][^2][^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值