docker-entrypoint.sh 文件的用处
参考出处
很多著名库的 Dockerfile 文件中,通常都是 ENTRYPOINT 字段会是这样:
ENTRYPOINT ["docker-entrypoint.sh"]
这里我们参考分析下 MySQL 的 Dockerfile 文件,来认识下 docker-entrypoint.sh 的用处。
MySQL 8.0 Dockerfile
网址:https://github.com/docker-library/mysql/tree/223f0be1213bbd8647b841243a3114e8b34022f4/8.0
里面的 Dockerfile 、 docker-entrypoint.sh 都写了很多的 shell 代码
这里通过 1 个例子,快速的了解 docker-entrypoint.sh 的使用方法
例子:MySQL 容器自建数据库
网址:https://hub.docker.com/_/mysql/ 中,章节[ Initializing a fresh instance ] 中提到,可以在MySQL容器启动时,初始化自定义数据库:
When a container is started for the first time, a new database with the specified name will be created and initialized with the provided configuration variables. Furthermore, it will execute files with extensions .sh, .sql and .sql.gz that are found in /docker-entrypoint-initdb.d. Files will be executed in alphabetical order. You can easily populate your mysql services by mounting a SQL dump into that directory and provide custom images with contributed data. SQL files will be imported by default to the database specified by the MYSQL_DATABASE variable.
原理就是如下:
Dockerfile 中定义:
ENTRYPOINT ["docker-entrypoint.sh"]
1
docker-entrypoint.sh 中在启动 mysql-server 前,创建数据库:
ls /docker-entrypoint-initdb.d/ > /dev/null
for f in /docker-entrypoint-initdb.d/*; do
process_init_file "$f" "${mysql[@]}"
done
/docker-entrypoint-initdb.d/ 中文件哪里来呢?
可以像这样:
FROM mysql:5.5
COPY db.sql /docker-entrypoint-initdb.d/
1
2
docker-entrypoint.sh 的用处
通过上述例子,可以清楚的看到,在启动容器时,可以通过 shell 脚本执行些预处理逻辑,然后通过:
exec $@
1
把启动容器入口正式交给使用者
即,需要容器启动预处理的,都可以使用 docker-entrypoint.sh 机制
再举个例子
比如本人遇到的一个项目,所以配置都在配置文件中,不走程序启动参数,也不走环境变量设置的。
那么打成 docker 镜像后,就是死配置了。
那么如何在不修改代码的情况下,达成可变配置呢。
使用 docker-entrypoint.sh 即可达成目的。
比如如下这样的 docker-entrypoint.sh :
#!/bin/bash
if [[ $redis_ip ]]; then
sed -i 's/redis_ip="[0-9.]*"/redis_ip="'$redis_ip'"/' config.ini
fi
if [[ $redis_port ]]; then
sed -i 's/redis_port="[0-9]*"/redis_port="'$redis_port'"/' config.ini
fi
echo "1" > /proc/sys/kernel/core_uses_pid
echo $CORE_PATH"/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
exec "$@"
docker 启动脚本如下:
docker run -d --restart=always \
--ulimit core=-1 --privileged=true\
-e redis_ip=$REDIS_IP \
-e redis_port=$REDIS_PORT \
xxx
以上,就可以达成自定义 redis ip/port ,并在启动容器时,设置了 core 文件路径与命名。
docker-entrypoint.sh 文件的用处的更多相关文章
- docker entrypoint入口文件详解
docker entrypoint入口文件详解 pasting Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较 [k8s]args指令案例-彻底理解docke ...
- Docker Compose模板文件介绍
模板文件是使用 Compose 的核心,涉及到的指令关键字也比较多,这里面大部分指令跟 docker run 相关参数的含义都是类似的.默认的模板文件名称为 docker-compose.yml ,格 ...
- Docker Compose YML文件配置
Docker Compose YML 默认的模板文件是 docker-compose.yml,其中定义的每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)来 ...
- Docker Compose 模板文件 V2
模板文件是使用Compose的核心,默认模板文件名称为docker-compose.yml ,格式为YAML格式. 目录结构 [root@localhost ~]# tree /opt/compose ...
- dockerfile定制docker的脚本文件
Dockerfile文件详解 #指定操作系统 FROM scratch #制作base image 基础镜像,尽量使用官方的image作为base image FROM centos #使用base ...
- supercool.sh文件里,有哪些恶意的命令
当你在一个bash命令行中输入"*"时,bash会扩展到当前目录的所有文件,然后将他们全部作为参数传递给程序.例如:rm *,将会删除掉当前目录的所有文件. 0x01 文件名被当做 ...
- [svc]entrypoint.sh shell脚本解析
最近搞influxdb绘图,看到其dockerfile的entry.sh,无奈看的不是很懂. 于是查了下.. docker run 通过传参实现配置文件覆盖 实现启动镜像时候可指定配置文件 如果不指定 ...
- 生成bat文件及sh文件
---windows下cmd执行java文件1.将project程序打成jar包2.新建文件夹--新建.bat文件3.bat文件内容:(config配置文件--lib用到的jar包,包括1的jar包) ...
- Linux下执行.sh文件
Linux下执行.sh文件有两种情况: 一.直接./加上文件名.sh,如运行hello.sh为./hello.sh[hello.sh必须有x权限] 二.直接sh 加上文件名.sh,如运行hello.s ...
- ubuntu下sh文件使用
可把shell命令批处理写进filename.sh文件 然后执行 chmod +x filename.sh 就可以执行./filename.sh了
随机推荐
- element表单校验 【登录】
async btnOK () { // 1. 表单校验 (调用表单的校验方法获取校验结果) // this.$refs.formRef.validate(function (valid) { // c ...
- JavaScript原型链污染探讨
如果你想弄明白什么怎样才可以实现JavaScript的原型链污染,那么你首先需要弄清楚两个东西,那就是__proto__和prototype. 到底什么才是__proto__和prototype? 那 ...
- 云原生周刊:Kubernetes Grafana 看板更新 | 2024.5.13
开源项目推荐 Chart Testing Chart Testing 是用于测试 Helm 图表的工具.它旨在用于对拉取请求进行 lint 和测试.它会自动检测针对目标分支更改的图表. Cluster ...
- 以 Kubernetes 原生方式实现多集群告警
作者:向军涛.雷万钧 来源:2023 上海 KubeCon 分享 可观测性来源 在 Kubernetes 集群上,各个维度的可观测性数据,可以让我们及时了解集群上应用的状态,以及集群本身的状态. Me ...
- KubeSphere 开源社区 2022 年度回顾与致谢
2022 年,国内的云原生技术生态日趋完善,细分技术项目也不断涌现,形成了完整的支撑应用云原生化的全生命周期技术体系.基础设施即代码.微服务.Serverless 等技术,促使基础设施资源向更加灵活弹 ...
- python-mongodb简单封装
#!/usr/bin/python # -*- coding: UTF-8 -*- '''@auther :mr.qin @IDE:pycharm''' import pymongo from too ...
- 为什么样本方差是除以 n-1 而不是 n?
摘自https://www.zhihu.com/question/20099757/answer/13971886 https://www.zhihu.com/question/20099757/an ...
- ClearCLIP:倒反天罡,删除两个组件反而可以提升密集预测性能 | ECCV'24
来源:晓飞的算法工程笔记 公众号,转载请注明出处 论文: ClearCLIP: Decomposing CLIP Representations for Dense Vision-Language I ...
- My SQL 列转行操作
原表结构如下,我们可以发现,"日运输量"和"车次"是在同一张表中相互独立的两个字段,即独立的两列数据,下面,我将系统中的测试数据以及代码全部放出来,以解释列转行 ...
- 4.4 Linux解压.zip格式的文件(unzip命令)
unzip 命令可以查看和解压缩 zip 文件.该命令的基本格式如下: [root@localhost ~]# unzip [选项] 压缩包名 此命令常用的选项以及各自的含义如表 1 所示. 选项 含 ...