Dockerfile中CMD和ENTRYPOINT的组合用法

 

Dockerfile中CMD和ENTRYPOINT的组合用法

 

root@ubuntu:/dockerfile/df_test5# pwd

/dockerfile/df_test5

root@ubuntu:/dockerfile/df_test5#cat Dockerfile

# 设置基本的镜像,后续命令都以这个镜像为基础 

FROM ubuntu

# 作者信息 

MAINTAINER shangwu 

# RUN命令会在上面指定的镜像里执行任何命令 

RUN apt-get update

RUN apt-get install -y nginx

 

#暴露ssh端口

EXPOSE 80 

ENTRYPOINT ["/usr/sbin/nginx"]

CMD ["-h"]

root@ubuntu:/dockerfile/df_test5#

 

 

 

 

root@ubuntu:/dockerfile/df_test5#docker build -t="df_test5" .

Sending build context to Docker daemon 2.048 kB

Sending build context to Docker daemon

Step 0 : FROM ubuntu

 --->dc8dd8718e57

Step 1 : MAINTAINER shangwu

 --->Using cache

 --->cd3d00722426

Step 2 : RUN apt-get update

 --->Using cache

 --->0096fe9ac7c4

Step 3 : RUN apt-get install -y nginx

 --->Using cache

 --->c8b93cc747d7

Step 4 : EXPOSE 80

 --->Using cache

 --->266559c6bc7f

Step 5 : ENTRYPOINT /usr/sbin/nginx;

 --->Using cache

 --->112ebc020e4e

Step 6 : CMD -h

 --->Running in 94961f2569d4

 --->e88d8bf0d386

Removing intermediate container 94961f2569d4

Successfully built e88d8bf0d386

root@ubuntu:/dockerfile/df_test5#

 

 

 

 

root@ubuntu:/dockerfile/df_test5# docker run -p 80-d --name ep_test2 df_test5 -g"daemon off;"

d97c51eb835e71add8787469c0b169b0a6329fee2060089a72107f8b62174036

root@ubuntu:/dockerfile/df_test5#

 

 

 

 

root@ubuntu:/dockerfile/df_test5#docker ps

CONTAINER ID       IMAGE               COMMAND                CREATED             STATUS              PORTS                   NAMES

d97c51eb835e       df_test5:latest    "/usr/sbin/nginx -g    6seconds ago       Up 5 seconds        0.0.0.0:32777->80/tcp   ep_test2                    

root@ubuntu:/dockerfile/df_test5#curl http://127.0.0.1:32777

root@ubuntu:/dockerfile/df_test5#

说明:

       1)-g "daemon off;"把CMD的命令给覆盖了;

 

 

 

### ENTRYPOINT 指令的作用 `ENTRYPOINT` 是 Dockerfile 中的一个关键指令,用于指定容器启动时默认执行的命令。与 `CMD` 不同的是,`ENTRYPOINT` 的主要特点是它定义的命令不会被忽略或覆盖,除非用户在运行容器时显式使用 `--entrypoint` 参数进行替换。因此,它更适合用于设定容器的核心功能,确保无论用户如何传递参数,容器始终以特定方式启动。 例如,若在 Dockerfile 中设置了 `ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]`,则每次启动该镜像生成的容器时,都会自动运行 Apache 服务器,并以前台模式持续运行[^3]。 ### ENTRYPOINT 的使用方法 `ENTRYPOINT` 支持两种格式:**exec 格式****shell 格式**: 1. **Exec 格式(推荐)** ```dockerfile ENTRYPOINT ["executable", "param1", "param2"] ``` 这种格式直接调用可执行文件,适合需要明确控制进程启动的情况。例如: ```dockerfile ENTRYPOINT ["nginx", "-g", "daemon off;"] ``` 上述示例表示容器启动时将运行 `nginx` 并以前台模式运行[^2]。 2. **Shell 格式** ```dockerfile ENTRYPOINT command param1 param2 ``` 这种格式会在 `/bin/sh -c` 下执行命令,适用于需要通过 shell 特性(如环境变量、管道等)执行的场景。例如: ```dockerfile ENTRYPOINT echo "Starting application..." ``` 在实际应用中,推荐使用 **exec 格式**,因为它能够更清晰地控制容器的主进程,并有助于避免因 shell 解释导致的行为不一致。 ### ENTRYPOINTCMD 的结合使用 `ENTRYPOINT` `CMD` 可以配合使用,其中 `ENTRYPOINT` 定义主命令,而 `CMD` 提供默认参数。例如: ```dockerfile ENTRYPOINT ["/app/myapp"] CMD ["--port", "8080"] ``` 在这种情况下,容器启动时会执行 `/app/myapp --port 8080`。如果用户运行容器时指定了新的参数(如 `docker run myimage --port 9000`),则这些参数会替换 `CMD` 中的默认值,但不会影响 `ENTRYPOINT` 所指定的主命令[^1]。 ### 示例 以下是一个完整的 Dockerfile 示例,展示了如何使用 `ENTRYPOINT` 来运行一个简单的 Python 应用程序: ```dockerfile FROM python:3.9-slim WORKDIR /app COPY . . RUN pip install --no-cache-dir -r requirements.txt ENTRYPOINT ["python", "app.py"] ``` 在这个例子中,容器启动时将自动运行 `app.py` 脚本,且无法被轻易覆盖。如果希望自定义启动参数,可以在运行容器时附加参数,如: ```bash docker run my-python-app --host=0.0.0.0 --port=5000 ``` 这将执行 `python app.py --host=0.0.0.0 --port=5000`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值