docker ENTRYPOINT与CMD区别
最后发布时间 : 2024-11-21 10:21:24
浏览量 :
在 Docker 中,ENTRYPOINT 和 CMD 都是用于定义容器启动时要执行的命令或脚本。它们之间的主要区别在于如何处理容器运行时传递的命令参数。
下面是它们的区别:
ENTRYPOINT:
- ENTRYPOINT 定义了容器中要执行的命令或可执行文件。
- ENTRYPOINT 的值可以是一个字符串或一个数组。
- 在运行容器时,你可以在 docker run 命令后面提供参数,这些参数将作为 ENTRYPOINT 命令的参数。
- 如果在运行容器时提供了参数,它们将被附加到 ENTRYPOINT 命令的末尾。
- ENTRYPOINT 的参数不会被覆盖,而是会被追加。
- 通常情况下,ENTRYPOINT 用于指定容器的主要执行命令或应用程序。
CMD:
- CMD 也定义了容器中要执行的命令或可执行文件。
- CMD 的值可以是一个字符串或一个数组。
- 在运行容器时,如果没有指定命令参数,那么 CMD 中定义的命令将被执行。
- 如果在运行容器时提供了命令参数,它们将覆盖 CMD 中定义的命令。
- CMD 的参数将被覆盖,而不是追加。
- CMD 通常用于提供容器的默认执行命令,但可以被用户在运行容器时覆盖。
下面是一个示例,演示了 ENTRYPOINT 和 CMD 的使用:
FROM ubuntu:latest
# 使用 ENTRYPOINT 定义容器的主要执行命令
ENTRYPOINT ["echo", "Hello,"]
# 使用 CMD 定义容器的默认参数
CMD ["World!"]
在上述示例中,如果你运行容器而不提供命令参数,那么容器将输出 Hello, World!。如果你在运行容器时提供了命令参数,例如 docker run my-image Goodbye!,那么容器将输出 Hello, Goodbye!,因为命令参数覆盖了 CMD 中定义的默认参数。
总结起来,ENTRYPOINT 用于定义容器的主要执行命令,而 CMD 用于提供容器的默认参数,但可以被用户在运行容器时覆盖。
docker 查看image ENTRYPOINT和CMD
docker inspect --format='{{.Config.Entrypoint}} {{.Config.Cmd}}' registry.cn-hangzhou.aliyuncs.com/wybioinfo/tidyverse:4.4
指定--entrypoint
docker run --rm -it\
-e USERID=$(id -u) -e GROUPID=$(id -g) \
-e DISABLE_AUTH=true \
-p 8787:8787 \
-w $PWD \
-v $PWD:/home/rstudio \
-v $PWD:$PWD \
--entrypoint /init \
registry.cn-hangzhou.aliyuncs.com/wybioinfo/tidyverse:4.4 bash
FROM ubuntu:20.04
RUN apt-get update -y
RUN apt-get install wget -y
WORKDIR /opt
RUN wget "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh"
RUN bash Miniforge3-$(uname)-$(uname -m).sh -b -p /opt/miniforge3
RUN rm Miniforge3-$(uname)-$(uname -m).sh
ENV PATH="/opt/miniforge3/bin:${PATH}"
RUN mamba init
RUN bash -c "source /root/.bashrc"
RUN mamba create --name gmwi2_env -c conda-forge mamba python=3.8 -y
SHELL ["mamba","run","-n","gmwi2_env","bash","-c"]
RUN mamba install -c bioconda -c conda-forge gmwi2=1.6 -y
ENV PATH /opt/miniforge3/envs/gmwi2_env/bin:$PATH