Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Dockerfile(9) - ENTRYPOINT 指令详解

Dockerfile(9) - ENTRYPOINT 指令详解

作者头像
小菠萝测试笔记
发布于 2021-11-02 08:18:10
发布于 2021-11-02 08:18:10
27.3K05
代码可运行
举报
运行总次数:5
代码可运行

ENTRYPOINT

两种写法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# exec 格式
ENTRYPOINT ["executable", "param1", "param2"]

# shell 格式
ENTRYPOINT command param1 param2
重点
  • ENTRYPOINT 指定镜像的默认入口命令,该入口命令会在启动容器时作为根命令执行,所有其他传入值作为该命令的参数
  • ENTRYPOINT 的值可以通过 来覆盖掉

docker run --entrypoint

  • 只有 Dockerfile 中的最后一条 ENTRYPOINT 指令会起作用
ENTRYPOINT 和 CMD 联合使用
  • 当指定了 ENTRYPOINT 后,CMD 的含义就发生了改变,不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令
  • 换句话说实际执行时,会变成
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ENTRYPOINT> "<CMD>"

灵魂拷问

那么有了 CMD 后,为什么还要有 ENTRYPOINT 呢?这种 <ENTRYPOINT> "<CMD>" 有什么好处么?

CMD 和 ENTRYPOINT 区别

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CMD                   # 指定这个容器启动的时候要运行的命令,不可以追加命令
ENTRYPOINT            # 指定这个容器启动的时候要运行的命令,可以追加命令

啥意思?这其实也是 ENTRYPOINT 的应用场景之一,下面来看

测试 CMD

编写 dockerfile 文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FROM centos
CMD ["ls","-a"]    
构建镜像
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker build -f CMD.dockerfile -t test .
运行容器
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> docker run test
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
运行容器并追加命令
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> docker run test -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
  • 看到可执行文件找不到的报错,executable file not found
  • 跟在镜像名后面的是 command,运行时会替换 CMD 的默认值,因此这里的 -l 替换了原来的 CMD,而不是追加在原来的 ls -a 后面
  • 而 -l 根本不是命令,所以自然找不到
如果想加入 -i 参数,必须重写 ls 命令
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> docker run test ls -a -l
total 56
drwxr-xr-x   1 root root 4096 Oct 28 09:36 .
drwxr-xr-x   1 root root 4096 Oct 28 09:36 ..
-rwxr-xr-x   1 root root    0 Oct 28 09:36 .dockerenv
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root  340 Oct 28 09:36 dev
drwxr-xr-x   1 root root 4096 Oct 28 09:36 etc
drwxr-xr-x   2 root root 4096 Nov  3  2020 home
lrwxrwxrwx   1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------   2 root root 4096 Sep 15 14:17 lost+found
drwxr-xr-x   2 root root 4096 Nov  3  2020 media
drwxr-xr-x   2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x   2 root root 4096 Nov  3  2020 opt
dr-xr-xr-x 221 root root    0 Oct 28 09:36 proc
dr-xr-x---   2 root root 4096 Sep 15 14:17 root
drwxr-xr-x  11 root root 4096 Sep 15 14:17 run
lrwxrwxrwx   1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x  13 root root    0 Oct 28 09:36 sys
drwxrwxrwt   7 root root 4096 Sep 15 14:17 tmp
drwxr-xr-x  12 root root 4096 Sep 15 14:17 usr
drwxr-xr-x  20 root root 4096 Sep 15 14:17 var

可以了,但这明显不是最优选择,ENTRYPOINT 就可以解决这个问题

测试 ENTRYPOINT

编写 dockerfile 文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FROM centos
ENTRYPOINT ["ls","-a"]    
构建镜像
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker build -f ENTRYPOINT.dockerfile -t test . 
运行容器并追加命令
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> docker run test -l
total 56
drwxr-xr-x   1 root root 4096 Oct 28 09:38 .
drwxr-xr-x   1 root root 4096 Oct 28 09:38 ..
-rwxr-xr-x   1 root root    0 Oct 28 09:38 .dockerenv
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root  340 Oct 28 09:38 dev
drwxr-xr-x   1 root root 4096 Oct 28 09:38 etc
drwxr-xr-x   2 root root 4096 Nov  3  2020 home
lrwxrwxrwx   1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------   2 root root 4096 Sep 15 14:17 lost+found
drwxr-xr-x   2 root root 4096 Nov  3  2020 media
drwxr-xr-x   2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x   2 root root 4096 Nov  3  2020 opt
dr-xr-xr-x 207 root root    0 Oct 28 09:38 proc
dr-xr-x---   2 root root 4096 Sep 15 14:17 root
drwxr-xr-x  11 root root 4096 Sep 15 14:17 run
lrwxrwxrwx   1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x  13 root root    0 Oct 28 09:38 sys
drwxrwxrwt   7 root root 4096 Sep 15 14:17 tmp
drwxr-xr-x  12 root root 4096 Sep 15 14:17 usr
drwxr-xr-x  20 root root 4096 Sep 15 14:17 var

ENTRYPOINT 的第二个应用场景

  • 启动容器就是启动主进程,但启动主进程前,可能需要一些准备工作,比如 mysql 可能需要一些数据库配置、初始化的工作,这些工作要在最终的 mysql 服务器运行之前解决
  • 还可能希望避免使用 root 用户去启动服务,从而提高安全性,而在启动服务前还需要以 root 身份执行一些必要的准备工作,最后切换到服务用户身份启动服务
  • 这些准备工作是和容器 CMD 无关的,无论 CMD 为什么,都需要事先进行一个预处理的工作,这种情况下,可以写一个脚本,然后放入 ENTRYPOINT 中去执行,而这个脚本会将接到的参数(也就是 <CMD>)作为命令,在脚本最后执行
官方镜像 redis
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FROM alpine:3.4
...
RUN addgroup -S redis && adduser -S -G redis redis
...
ENTRYPOINT ["docker-entrypoint.sh"]

EXPOSE 6379
CMD [ "redis-server" ]
docker-entrypoint.sh
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/sh
...
# allow the container to be started with `--user`
if [ "$1" = 'redis-server' -a "$(id -u)" = '0' ]; then
    find . \! -user redis -exec chown redis '{}' +
    exec gosu redis "$0" "$@"
fi

exec "$@"

该脚本的内容就是根据 CMD 的内容来判断,如果是 redis-server 的话,则切换到 redis 用户身份启动服务器,否则依旧使用 root 身份执行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@poloyy ~]#  docker run -it redis id
uid=0(root) gid=0(root) groups=0(root)

# 直接进入容器内部
[root@poloyy ~]#  docker run -it redis
root@565f89976d63:/#
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-10-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
我和Linux的初次亲密接触,那些让人脸红心跳的基础命令
我们以后在给程序进行执行命令的时候我们可以单纯的进行命令的输入,也可以进行选项的输入操作
Undoom
2025/05/29
280
我和Linux的初次亲密接触,那些让人脸红心跳的基础命令
24-性能分析-基础
load average的计算:所以cpu使用时间之和 + io使用时间之和 与 空闲时间之和 进行比较
zx钟
2021/07/06
3670
基于Docker的MindSpore安装与使用基础介绍
MindSpore是一款新一代AI开源计算框架,其特色在于:创新编程范式,AI科学家和工程师更易使用,便于开放式创新;该计算框架可满足终端、边缘计算、云全场景需求,能更好保护数据隐私;可开源,形成广阔应用生态。MindSpore的软件架构如下图所示:
DechinPhy
2021/05/21
1.6K0
docker上部署MySQL实例
容器云的概念现在很火,现在很多公司都把MySQL部署在容器上,开始今天内容之前,我们先来看看容器云的概念吧。
AsiaYe
2020/08/18
7930
docker上部署MySQL实例
pdflatex环境部署步骤Docker的基本操作
在各大平台的官方源里面应该都会有提供docker容器,因此这里我们也不过多的赘述。
不知名站长
2021/04/03
7720
pdflatex环境部署步骤Docker的基本操作
DockerFile 学习
1、每个保留关键字(指令)都必须是大写字母 2、执行从上到下的顺序 3、# 表示注释 4、每一个指令都会创建一个新的镜像,并提交
木字楠
2022/11/15
3000
DockerFile 学习
云原生技术之docker学习笔记(1)
最近的工作中,MySQL和MongoDB运维部分的内容比较少。主要工作内容都会频繁接触docker和k8s相关的内容,所以准备写写这块儿的内容。
AsiaYe
2021/01/12
3960
shell脚本中$#、$*、$@、$?、$0等含义一文搞懂
3、$$:表示进程的id;Shell本身的PID(ProcessID,即脚本运行的当前 进程ID号)
向着百万年薪努力的小赵
2022/12/02
13.3K0
【Podman】podman入门学习 | Docker替代品
在上手程度上:Podman 的操作方式与 Docker 高度兼容,很适合docker用户转型使用podman。使用命令几乎和docker相同
宝耶需努力
2022/12/13
2.1K0
【Podman】podman入门学习 | Docker替代品
【linux命令讲解大全】117. LINUX命令详解之ls
ls命令是list的缩写,用于显示目标列表,是Linux中使用率较高的命令。ls命令的输出信息可以进行彩色加亮显示,以分区不同类型的文件。
全栈若城
2024/03/02
2750
docker(初识Dockerfile)
Dockerfile 就是用来构建docker镜像的构建文件!命令脚本!先体验一下!
崔笑颜
2020/10/29
3920
docker(初识Dockerfile)
容器联合文件系统
rootfs(根文件系统)是挂载在容器根目录上,用来为容器进程提供隔离后执行环境的文件系统,就是所谓的“容器镜像”。所以,一个最常见的 rootfs,或者说容器镜像,会包括如下所示的一些目录和文件,比如 /bin,/etc,/proc 等等:
Se7en258
2021/05/18
1.4K0
容器联合文件系统
编写自己的Tomcat docker镜像
dockerfile是面向开发的,我i们以后需要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单。
冷环渊
2021/11/10
7690
【分享】MPSoC交叉编译例子
有工程师反馈,使用A53交叉编译器直接编译最简单的C文件,编译器也报告。"stdio.h: No such file or directory"
hankfu
2020/10/26
1.2K0
建议收藏 | Linux常用命令
cat,又是一个相对高频率的命令。比较官方的说法是命令用于链接文件并打印到标准输出设备上。这个文本输出命令可以用来查看文件内容,创建内容等,下面我们介绍几个比较实用的用法。命令格式 : cat [选项]... [文件]...
数字芯片社区
2020/07/23
3K0
15.2/15.3 使用vsftpd搭建ftp
使用vsftpd搭建ftp目录概要 centos上自带vsftpd yum install -y vsftpd useradd -s /sbin/nologin virftp vim /etc/vsftpd/vsftpd_login //内容如下,奇数行为用户名,偶数行为密码,多个用户就写多行 testuser1 aminglinux chmod 600 /etc/vsftpd/vsftpd_login db_load -T -t hash -f /etc/vsftpd/vsftpd_login /etc/
运维小白
2018/02/06
1.9K0
15.2/15.3 使用vsftpd搭建ftp
【Linux】萌新看过来!一篇文章带你走进Linux世界
可能很多刚开始接触Linux的童鞋们和我一样,在这之前对Linux并不熟悉,只知道Linux是一个操作系统,之外一概不知。没关系,问题不大,本篇文章将会带你初步的认识Linux,了解Linux的相关背景和一些简单的指令,让你从一个小萌新成为一个大萌新。 本文使用Xshell远程登录Linux服务器,CentOS系统。
_小羊_
2024/10/16
1100
【Linux】萌新看过来!一篇文章带你走进Linux世界
【Docker】008-Dockerfile制作镜像
dockerfile是面向开发的,我们以后要发布项目,做镜像,需要编写dockerfile文件,这很简单!
訾博ZiBo
2025/01/06
1230
【Docker】008-Dockerfile制作镜像
标准生产ftp建设
需要访问FTP服务端提供的资源时,可以使用专门的FTP客户端/管理工具(FTP命令程序、Filezilla图形工具),也可以使用Web浏览器、下载工具(比如wget)等支持FTP协议的通用软件。
Bob hadoop
2021/01/04
6470
【Linux】权限管理——专治不会设置权限而头疼
在Linux系统中,权限是指系统用来限制和控制用户对文件和目录的访问能力的一组规则。这些规则决定了用户可以对文件或目录执行哪些操作,比如读取(read)、写入(write)、执行(execute)等。Linux系统通过权限来维护系统的安全性和数据的完整性。
_小羊_
2024/10/16
2390
【Linux】权限管理——专治不会设置权限而头疼
相关推荐
我和Linux的初次亲密接触,那些让人脸红心跳的基础命令
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验