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-compose 详解及示例代码

    docker-compose 详解及示例代码

    这篇文章主要介绍了docker-compose 详解的相关资料,并附简单实例,需要的朋友可以参考下
    2016-10-10
  • docker搭建mongodb单节点副本集的实现

    docker搭建mongodb单节点副本集的实现

    本文主要介绍了docker搭建mongodb单节点副本集的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Docker部署Nuxt.js项目的实现

    Docker部署Nuxt.js项目的实现

    这篇文章主要介绍了Docker部署Nuxt.js项目的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 在 OpenKylin 上安装 Docker的详细过程

    在 OpenKylin 上安装 Docker的详细过程

    在 OpenKylin 上安装 Docker可能会遇到与 Ubuntu 略有不同的包管理问题,这篇文章主要介绍了在 OpenKylin上安装 Docker的过程,需要的朋友可以参考下
    2024-05-05
  • docker中nginx卸载、安装、配置及挂载详细教程

    docker中nginx卸载、安装、配置及挂载详细教程

    这篇文章主要给大家介绍了关于docker中nginx卸载、安装、配置及挂载的相关资料,文中通过实例代码介绍是非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-09-09
  • Docker容器如何查看ip地址的实现方法

    Docker容器如何查看ip地址的实现方法

    这篇文章主要介绍了Docker容器如何查看ip地址的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Docker Buildx构建多平台镜像的实现

    Docker Buildx构建多平台镜像的实现

    本文主要介绍了Docker Buildx构建多平台镜像的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Docker能否成为下一个“Linux”?

    Docker能否成为下一个“Linux”?

    今天小编就为大家分享一篇关于Docker能否成为下一个“Linux”?,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Docker的安装以及更换仓库源详细图文教程

    Docker的安装以及更换仓库源详细图文教程

    Docker是一个开源的应用容器引擎,它允许开发者打包他们的应用以及依赖包到一个可移植的容器中,下面这篇文章主要给大家介绍了关于Docker的安装以及更换仓库源的相关资料,需要的朋友可以参考下
    2024-07-07
  • docker构建的镜像的三种方式小结

    docker构建的镜像的三种方式小结

    这篇文章主要为大家详细介绍了docker中构建的镜像的三种方式,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下
    2024-04-04

最新评论