26 面试题:cmd和entrypoint区别
# todo Docker面试题
# * ENTRYPOINT和CMD的区别以及用法
# 和RUN指令一样,分为两种格式
# exec
# shell
# todo ENTRYPOINT和CMD的玩法
# * 作用和CMD一样,都是在指定容器启动程序以及参数。
# * 当指定了ENTRYPOINT之后,CMD指令的语义就有了变化,而是把CMD的内容当作参数传递给ENTRYPOINT指令
# CMD xxx
# ENTRYPOINT xxx
# todo 3.案例, Dockerfile
"""
FROM centos:7.8.2003
# 修复 CentOS 和 EPEL 源
RUN rpm --rebuilddb && \
cd /etc/yum.repos.d/ && \
# 修复 CentOS 源
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*.repo && \
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*.repo && \
# 修复 EPEL 源(如果已存在)并安装 EPEL
yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm || true && \
# 修复 EPEL 源配置
if [ -f /etc/yum.repos.d/epel.repo ]; then \
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/epel.repo && \
sed -i 's|#baseurl=http://download.fedoraproject.org|baseurl=https://archives.fedoraproject.org|g' /etc/yum.repos.d/epel.repo; \
fi && \
yum clean all && \
yum install -y curl
CMD ["curl","-s","http://ipinfo.io/ip"]
"""
# * CMD ["curl","-s","http://ipinfo.io/ip"] 用法如下:
# docker run my_centos url -s http://ipinfo.io/ip
# todo 4. 构建镜像
"""
docker build -t centos_curl .
"""
# todo 5. 检查镜像
"""
docker images
"""
# todo 6. 运行镜像,生成容器,并且检查站点访问
"""
docker run -d -p 8092:80 centos_curl
[root@laoma docker_file_ex]# curl -s http://ipinfo.io/ip
223.106.28.174[root@laoma docker_file_ex]#
[root@laoma docker_file_ex]# IP=$(curl -s http://ipinfo.io/ip)
[root@laoma docker_file_ex]# curl -sI http://ipinfo.io/$IP
HTTP/1.1 200 OK
access-control-allow-origin: *
content-type: application/json
Content-Length: 279
date: Sun, 26 Apr 2026 08:32:38 GMT
via: 1.1 google
[root@laoma docker_file_ex]#
"""
# todo 7.上述运行正确,希望再次传入参数
# * 发下那是无法直接传入参数的, 该形式是覆盖镜像中的CMD指令
# * 就好比把docker镜像,当做一个环境,去执行后面的命令
"""
[root@laoma docker_file_ex]# docker run centos_curl
223.106.28.174[root@laoma docker_file_ex]#
[root@laoma docker_file_ex]# docker run centos_curl pwd
/
[root@laoma docker_file_ex]# docker run centos_curl pwd
/
[root@laoma docker_file_ex]#
[root@laoma docker_file_ex]# docker run centos_curl -I
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-I": executable file not found in $PATH: unknown.
[root@laoma docker_file_ex]#
"""
# todo 8. 正确的给容器传入一个 -I 参数
# * 希望容器内正确完成这个命令
# * docker run centos_curl -I
# ! 解决办法1: 给容器传入新的完整的命令
"""
[root@laoma docker_file_ex]# IP=$(curl -s http://ipinfo.io/ip)
[root@laoma docker_file_ex]# docker run centos_curl curl -s http://ipinfo.io/IP -I
HTTP/1.1 200 OK
access-control-allow-origin: *
content-type: text/html; charset=utf-8
Content-Length: 14
date: Sun, 26 Apr 2026 08:46:21 GMT
via: 1.1 google
[root@laoma docker_file_ex]#
"""
# ! 解决办法2: 使用ENTRYPPOINT指令
# * 修改Dockerfile: ENTRYPOINT ["curl","-s","http://ipinfo.io/ip"]
"""
FROM centos:7.8.2003
# 修复 CentOS 和 EPEL 源
RUN rpm --rebuilddb && \
cd /etc/yum.repos.d/ && \
# 修复 CentOS 源
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*.repo && \
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*.repo && \
# 修复 EPEL 源(如果已存在)并安装 EPEL
yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm || true && \
# 修复 EPEL 源配置
if [ -f /etc/yum.repos.d/epel.repo ]; then \
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/epel.repo && \
sed -i 's|#baseurl=http://download.fedoraproject.org|baseurl=https://archives.fedoraproject.org|g' /etc/yum.repos.d/epel.repo; \
fi && \
yum clean all && \
yum install -y curl
ENTRYPOINT ["curl","-s","http://ipinfo.io/ip"]
"""
# todo 9. 再次构建镜像
"""
docker build -t centos_curl .
"""
# todo 10. 运行镜像,生成容器,并且检查站点访问
2.Dockerfile内容及测试
浙公网安备 33010602011771号