python入口文件详解_docker entrypoint入口文件详解
在编写Dockerfile的时候,包含一个entrypoint配置,该配置的作用是在容器启动之前做一些初始化配置,或者一些自定义的配置等。通常是一个脚本,然后在脚本里配置相关预定义项。这篇文档就详细说一说entrypoint入口文件的编写技巧。
下面以mysql官方镜像中的entrypoint文件docker-entrypoint.sh为例,文件地址为:
set -e
你写的每个脚本都应该在文件开头加上set -e, 这句语句告诉bash如果任何语句的执行结果不是true则应该退出. 这样的好处是防止错误像滚雪球般变大导致一个致命的错误, 而这些错误本应该在之前就被处理掉. 如果要增加可读性, 可以使用set -o errexit, 它的作用与set -e相同
set -o pipefail
设计用途同上, 就是希望在执行错误之后立即退出, 不要再向下执行了. 而 -o pipefail 的作用域是管道, 也就是说在 Linux 脚本中的管道, 如果前面的命令执行出了问题, 应该立即退出
shopt -s nullglob
在使用 Linux 中的通配符时 * ?等 如果没有匹配到任何文件, 不会报 No such file or directory 而是将命令后面的参数去掉执行
if [ "${1:0:1}" = '-' ]; then...
这是一个判断语句, 在官方文件中, 上一行已经给出了注释:if command starts with an option, prepend mysqld
这个判断语句是${1:0:1} 意思是判断$1(调用该脚本的第一个参数), 偏移量0(不偏移), 取一个字符(取字符串的长度)
如果判断出来调用这个脚本后面所跟的参数第一个字符是-中横线的话, 就认为后面的所有字符串都是 mysqld 的启动参数
上面的这个操作类似于 Python 的字符串切片
set -- mysqld "$@"
在上面判断完第一个参数是-开头之后, 紧接着就执行了 set -- mysqld "$@" 这个命令. 使用了 set -- 的用法. set --会将他后面所有以空格区分的字符串, 按顺序分别存储到$1, $2, $3 变量中, 其中新的$@为set --后面的全部内容
举例来说: bash docker-entrypoint.sh -f xxx.conf
在这种情况下, set -- mysqld "$@"中的 $@ 的值为-f xxx.conf
当执行完 set -- mysqld "$@" 这条命令后:
$1=mysqld
$2=-f
$3=xxx.conf
$@=mysqld -f xxx.conf
可以看到, 当执行 docker-entrypoint.sh脚本的时候后面加了 -x形式的参数之后, $@的值发生的改变, 在原有$@值的基础之上, 在前面又预添加了 mysqld 命令
exec "$@"
几乎在每个docker-entrypoint.sh脚本的最后一行, 执行的都是 exec "$@"命令
这个命令的意义在于你已经为你的镜像预想到了应该有的调用情况, 当实际使用镜像的人执行了你没有预料到的可执行命令时, 将会走到脚本的这最后一行, 去执行用户新的可执行命令
情况判断
上面直接说了脚本的最后一行, 在之前的脚本中, 需要充分的去考虑你自己的脚本可能会被调用的情况. 还是拿 MySQL 官方的 dockerfile 来说, 他判断以下情况:
开头是 - , 认为是参数的情况
开头是 mysqld, 且用户 id 为0 (root 用户) 的情况
开头是 mysqld 的情况
判断完自己应用的所有调用形态之后, 最后应该加上exec "$@" 命令兜底
${mysql[@]}
Shell 中的数组, 直接执行 ${mysql[@]} 会把这个数组当做可执行程序来执行
mysql=( mysql --protocol=socket -uroot -hlocalhost --socket="${SOCKET}" )
echo ${mysql[1]}
-- output: mysql
echo ${mysql[2]}
--output: --protocol=socket
echo ${mysql[3]}
--output: -uroot
echo ${mysql[4]}
--output: -hlocalhost
echo ${mysql[@]}
--output: mysql --protocol=socket -uroot -hlocalhost --socket=
exec gosu mysql "$BASH_SOURCE" "$@"
这里的 gosu 命令, 是 Linux 中 sudo 命令的轻量级”替代品”
gosu 是一个 golang 语言开发的工具, 用来取代 shell 中的 sudo 命令. su 和 sudo 命令有一些缺陷, 主要是会引起不确定的 TTY, 对信号量的转发也存在问题. 如果仅仅为了使用特定的用户运行程序, 使用 su 或 sudo 显得太重了, 为此 gosu 应运而生.
gosu 直接借用了 libcontainer 在容器中启动应用程序的原理, 使用 /etc/passwd 处理应用程序. gosu 首先找出指定的用户或用户组, 然后切换到该用户或用户组. 接下来, 使用 exec 启动应用程序. 到此为止, gosu 完成了它的工作, 不会参与到应用程序后面的声明周期中. 使用这种方式避免了 gosu 处理 TTY 和转发信号量的问题, 把这两个工作直接交给了应用程序去完成
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
python入口文件详解_docker entrypoint入口文件详解相关推荐
- docker mysql详解_Docker轻松入门(详解)
一 Docker简介 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发 ...
- docker entrypoint入口文件详解
docker entrypoint入口文件详解 pasting Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较 [k8s]args指令案例-彻底理解docke ...
- webpack文件夹打包_webpack多入口文件页面打包详解
本文主要介绍了webpack多入口文件页面打包配置详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧,希望帮助到大家. 大多数情况下,我们使用 webpack来打包单页应 ...
- python硬件交互_对Python的交互模式和直接运行.py文件的区别详解
对Python的交互模式和直接运行.py文件的区别详解 看到类似C:\>是在Windows提供的命令行模式,看到>>>是在Python交互式环境下. 在命令行模式下,可以执行p ...
- python编译器怎么运行不在路径中的py文件_对python当中不在本路径的py文件的引用详解...
众所周知,如果py文件不在当前路径,那么就不能import,因此,本文介绍如下两种有效的方法: 方法1: 修改环境变量,在~/.bashrc里面进行修改,然后source ~/.bashrc 方法2: ...
- python怎么读写文件-手机上怎么写pythonPython文件读写详解及设置文件的字符编码...
文件读写操作在各种编程语言中都是比较重要的部分,也是很常用的部分,今天就来详细说一下python对文件的读写操作,以及需要注意的点. 一. python打开文件 代码如下:f = open(" ...
- python交互式和文件式区别_Python 运行.py文件和交互式运行代码的区别详解
代码版本:3.6.3 1. 交互式运行代码会直接给出表达式的结果,运行代码文件必须print才能在控制台看到结果. 直接给出结果: 没有print是看不到结果的: 有print才能看到结果: 另:交互 ...
- python中docx模块的使用_python使用docx模块读写docx文件的方法与docx模块常用方法详解...
一,docx模块 Python可以利用python-docx模块处理word文档,处理方式是面向对象的.也就是说python-docx模块会把word文档,文档中的段落.文本.字体等都看做对象,对对象 ...
- [CentOS Python系列] 二.pscp上传下载服务器文件及phantomjs安装详解
从2014年开始,作者主要写了三个Python系列文章,分别是基础知识.网络爬虫和数据分析. Python基础知识系列:Pythonj基础知识学习与提升 Python网络爬虫系列:Python爬虫之S ...
最新文章
- QT最方便的LOG库使用Easylogging++,只需要一个头文件
- 设计模式08: Composite 组合模式(结构型模式)
- java类内存中只能运行一个实例对象
- 【OS学习笔记】二十 保护模式六:保户模式下操作系统内核如何加载用户程序并运行 对应的汇编代码之主引导扇区程序
- iphone中结束电话后返回自己的应用
- gridview 通用分页实现
- python项目上线_django之项目部署上线
- RAX,eax,ax,ah,al 关系
- 数据结构11——KMP
- python批量添加水印_手把手教你用Python批量给图片添加水印!知了干货分享!
- 软考-程序员-知识点汇总
- 机器学习模型训练全流程!
- ISA服务器安装设置全集
- 【SpringBoot项目No qualifying bean of type ‘×××Mapper‘ available:的错误解决】
- 《塞尔达传说》与氛围游戏的兴起:在游戏中感受禅意
- iOS小技能:监听H5页面goBack返回事件 网页监听APP返回键 (NavigationBackItemInjection)
- Python编写函数,计算某个员工的奖金发放额度,要求输入员工的营业额,输出对应的奖金总额
- 从简单的信道估计说起
- semantic navigation 目标驱动的视觉语义导航(一)
- elevation_mapping使用笔记