docker-entrypoint.sh文件的用处详解

 更新时间:2024年01月18日 08:56:30   作者:fananchong2  
这篇文章主要介绍了docker-entrypoint.sh文件的用处,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

参考出处:

很多著名库的 Dockerfile 文件中,通常都是 ENTRYPOINT 字段会是这样:

ENTRYPOINT ["docker-entrypoint.sh"]

这里我们参考分析下 MySQL 的 Dockerfile 文件,来认识下 docker-entrypoint.sh 的用处。

MySQL 8.0 Dockerfile

里面的 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"]

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/

docker-entrypoint.sh 的用处

通过上述例子,可以清楚的看到,在启动容器时,可以通过 shell 脚本执行些预处理逻辑,然后通过:

exec $@

把启动容器入口正式交给使用者

即,需要容器启动预处理的,都可以使用 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 bridge网络模式(端口映射)配置过程

    项目访问使用docker bridge网络模式(端口映射)配置过程

    这篇文章主要介绍了项目访问使用docker bridge网络模式(端口映射)配置过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • docker搭建lnmp环境的实现步骤

    docker搭建lnmp环境的实现步骤

    DNMP(Docker + Nginx + MySQL + PHP7/5 + Redis)是一款全功能的LNMP一键安装程序,本文就来介绍一下docker搭建lnmp环境的实现步骤,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • 把数据库部署在docker容器内有哪些缺陷

    把数据库部署在docker容器内有哪些缺陷

    这篇文章主要介绍了把数据库部署在docker容器内有哪些缺陷,帮助大家更好的理解和学习docker容器和数据库,感兴趣的朋友可以了解下
    2020-08-08
  • 如何解决Docker镜像缺少字体的问题

    如何解决Docker镜像缺少字体的问题

    在使用Spire.Office.Free将Excel转换为HTML时,遇到字体缺失错误,通过在Dockerfile中添加字体文件,成功解决了问题,建议在遇到类似问题时,可以尝试在Dockerfile中添加缺失的字体文件
    2025-02-02
  • 在CentOS启动时自动加载内核模块overlayfs操作

    在CentOS启动时自动加载内核模块overlayfs操作

    这篇文章主要介绍了在CentOS启动时自动加载内核模块overlayfs操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • docker 跨平台构建镜像的示例详解

    docker 跨平台构建镜像的示例详解

    这篇文章主要介绍了docker跨平台构建镜像的案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • Ubuntu 20.04 上安装和使用 Docker的详细过程(安装包)

    Ubuntu 20.04 上安装和使用 Docker的详细过程(安装包)

    这篇文章主要介绍了Ubuntu 20.04 上安装和使用 Docker的详细过程(安装包),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • 使用Docker容器在Linux上部署MySQL方式

    使用Docker容器在Linux上部署MySQL方式

    本文详细介绍了如何在Linux上使用Docker部署MySQL服务器,包括下载镜像、启动容器、连接到服务器、停止和删除容器,以及升级服务器的步骤
    2025-02-02
  • Docker的四种网络模式

    Docker的四种网络模式

    这篇文章介绍了Docker的四种网络模式,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • docker容器分配固定ip的实现示例

    docker容器分配固定ip的实现示例

    如果不固定ip,每次主机重启后,docker会动态给容器分配ip,导致redis容器的IP自动换了 ,然后还得去改配置就很烦,本文主要介绍了docker容器分配固定ip的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12

最新评论