juechafun/05-原子化笔记本/Linux-Docker构建镜像.md

149 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
#领域/Linux
#复盘/0
## 一句话描述
[__dockerfile 相关语法______]
---
## 核心规范
>空想不如行动,积累胜于苛求。
>实践 > 沉淀 > 完美主义
实践不是盲目行动,而是带着“小目标、可验证“的方向试错,实践后必须沉淀(比如记录问题、总结规律),否则就是低水平重复。
实践大于沉淀,沉淀大于完美;完美是沉淀的终局方向,沉淀是实践的复盘产物;分域施策,避坑落地,始于行动,终于迭代。
---
## 三省沉淀法
- 达成了[__简单的镜像构建______]目标
- 遇到了[_暂时无更多的应用_______]问题
- 下次改进[__在开发过程中更多的使用______]
## 个人理解
[___配置容器和环境例如厨房微波炉容器、空气炸锅容器、汤锅容器预先放入食材外部选择烹饪参数例如火力、时长_____]
## 实践计划
#状态/待实践
1. [__使用docker镜像封装一些工具例如通知、备份______]
2. [________]
3. [________]
---
## 核心定义
docker 构建镜像
### 示例
#### ✅ 构建镜像并一次性启动
```bash
#!/bin/bash
# mytool.sh - 自定义Shell工具支持--input --output参数模拟实际工具的参数运行
set -e # 执行出错直接退出,符合工具运行逻辑
# 初始化参数
INPUT_FILE=""
OUTPUT_FILE=""
# 解析命令行参数(和实际工具的参数解析逻辑一致)
while [[ $# -gt 0 ]]; do
case "$1" in
--input)
INPUT_FILE="$2"
shift 2
;;
--output)
OUTPUT_FILE="$2"
shift 2
;;
*)
echo "错误:未知参数 $1"
echo "使用方式:./mytool.sh --input 输入文件 --output 输出文件"
exit 1
;;
esac
done
# 校验参数
if [[ -z $INPUT_FILE || -z $OUTPUT_FILE ]]; then
echo "错误:必须指定--input和--output参数"
echo "使用方式:./mytool.sh --input 输入文件 --output 输出文件"
exit 1
fi
if [[ ! -f $INPUT_FILE ]]; then
echo "错误:输入文件 $INPUT_FILE 不存在!"
exit 1
fi
# 工具核心逻辑(替换成你的工具代码即可)
echo "===== 工具开始运行 ====="
echo "输入文件:$INPUT_FILE"
echo "输出文件:$OUTPUT_FILE"
echo "输入文件内容:"
cat $INPUT_FILE
# 核心功能:将输入文件内容+时间戳写入输出文件
echo -e "\n===== 工具处理结果 =====" > $OUTPUT_FILE
echo "处理时间:$(date +'%Y-%m-%d %H:%M:%S')" >> $OUTPUT_FILE
echo "原始内容:" >> $OUTPUT_FILE
cat $INPUT_FILE >> $OUTPUT_FILE
echo -e "\n===== 工具运行完成 ====="
```
```Dockerfile
# 选轻量基础镜像alpine仅5M左右内置bash/sh无多余依赖
FROM alpine:3.19
# 安装必要依赖alpine默认无bash仅需这一步其他基础镜像如debian可省略
RUN apk add --no-cache bash
# 创建工作目录,避免权限混乱,统一工具运行路径
WORKDIR /app
# 拷贝自定义工具源码到容器内的工作目录
COPY mytool.sh /app/
# 给工具添加执行权限Docker打包脚本/二进制工具的核心步骤,必须加)
RUN chmod +x /app/mytool.sh
# 定义容器入口命令关键用ENTRYPOINT确保运行时传参能追加到工具后
# 这样docker run 镜像名 --input xxx 会被解析为 /app/mytool.sh --input xxx
ENTRYPOINT ["/app/mytool.sh"]
```
```plaintext
这是测试输入文件,
自定义工具会读取该内容,
并写入到输出文件中。
```
```bash
# 构建镜像
docker build -t mytool-shell:latest .
# 执行命令
docker run --rm -v $(pwd):/app mytool-shell:latest --input test.txt --output result.json
```
### 避坑点
⚠️ 避坑点1
解决方案: