目录
1、介绍
ENTRYPOINT :容器启动后执行的命令,使用此参数后初始命令不容易被覆盖
ENTRYPOINT的格式和 RUN 指令格式一样,ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。ENTRYPOINT在运行时也可以替代,不过比 CMD 要略显繁琐,需要通过 docker run 的参数--entrypoint来指定。应用场景:
- 让镜像变成像命令一样使用
- 应用运行前的准备工作
- 存在多个ENTRYPOINT的指令时,仅有最后一个生效
2、实验
2.1 创建dockerfile文件存放目录
mkdir /test
cd /test
2.2 修改dockerfile文件
[root@ybb test]# cat dockerfile
FROM 2073e0bcb60e
ENV WEB_ROOT /usr/share/nginx/html/
COPY index.html ${WEB_ROOT}
ADD entrypoint.sh /bin/
CMD ["/usr/sbin/nginx","-g","daemon off;"]
ENTRYPOINT ["/bin/entrypoint.sh"]
[root@ybb test]#
ENTRYPOINT ["/bin/entrypoint.sh"]在CMD运行前结束,ENTRYPOINT运行的是shell进程。
- ENV 是定义环境变量
- COPY 复制文件index.html
- ADD 这里的功能也是复制,和COPY一样
- nginx -g 表示设置个全局选项
- daemon 后台运行
- off 不在后台运行,放到前台运行
2.3 创建entrypoint.sh文件
[root@ybb test]# cat entrypoint.sh
#!/bin/sh
cat > /etc/nginx/conf.d/nginx.conf << EOF
server {
server_name $HOSTNAME;
listen ${ip:-0.0.0.0}:${port:-80};
root ${DOC_ROOT:-/usr/share/nginx/html};
}
EOF
exec "$@"
[root@ybb test]#
- EOF只是一个分界符,当shell遇到<<时,它知道下一个词是一个分界符。在该分界符以后的内容都被当作输入,直到shell又看到该分界符(位于单独的一行)。
- exec "$@"当执行CMD时,会替换ENTRYPOINT的shell进程,执行CMD的所有“$@”会替换当前脚本的执行进程,这样CMD就是容器的第一进程。
- 若没有exec "$@",这个脚本当执行完仍会占用一个shell进程,容器最好有且只有一个进程那就是程序的执行进程。
2.4 创建index.html
[root@ybb test]# cat index.html
qwqwqwqw
[root@ybb test]#
2.5 创建镜像
[root@ybb test]# docker build -t nginx:v3 ./
Sending build context to Docker daemon 4.096 kB
Step 1 : FROM 2073e0bcb60e
---> 2073e0bcb60e
Step 2 : ENV WEB_ROOT /usr/share/nginx/html/
---> Using cache
---> 3a849b90d442
Step 3 : COPY index.html ${WEB_ROOT}
---> Using cache
---> 2a2ae4f2f31a
Step 4 : ADD entrypoint.sh /bin/
---> Using cache
---> 96a148231d1d
Step 5 : CMD nginx -g daemon off;
---> Using cache
---> 1e1f9fde7545
Step 6 : ENTRYPOINT /bin/entrypoint.sh
---> Using cache
---> 378c8493d0dc
Successfully built 378c8493d0dc
[root@ybb test]#
2.6 测试略
进入容器查看entrypoint.sh文件
查看index.html文件
查看nginx.conf文件