在 Docker 中,ENTRYPOINT 和 CMD 都是用于定义容器启动时要执行的命令或脚本。它们之间的主要区别在于如何处理容器运行时传递的命令参数。
下面是它们的区别:
ENTRYPOINT:
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 inspect --format='{{.Config.Entrypoint}} {{.Config.Cmd}}' registry.cn-hangzhou.aliyuncs.com/wybioinfo/tidyverse:4.4
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