Docker`CMD abc` VS`CMD `

当命令被指定为CMD abc一切都按预期工作,同时用CMD ["a", "b", "c"]指定相同的命令 – 会产生意想不到的结果。 我试图在docker里运行Jupyter(ipython)。 我的CMD命令是启动它。 看来,不pipe我指定的方式 – Jupyter开始。 但是,只有当我将它指定为CMD abc ,jupyter才能正常工作,并且可以启动一个内核。 在这种情况下,“新笔记本”命令的作品

  FROM debian:stable RUN apt-get update && apt-get install -y wget bzip2 RUN wget https://repo.continuum.io/miniconda/Miniconda2-latest-Linux-x86_64.sh && \ bash Miniconda2-latest-Linux-x86_64.sh -b -p /anaconda2 RUN /anaconda2/bin/conda install jupyter #CMD ["/anaconda2/bin/jupyter", "notebook", "--port=8888", "--no-browser", "--ip=0.0.0.0", "--NotebookApp.token=''"] CMD /anaconda2/bin/jupyter notebook --port=8888 --no-browser --ip=0.0.0.0 --NotebookApp.token='' # docker build -t IMAGE_NAME . # docker run --rm -it -p 8888:8888 IMAGE_NAME 

在这种情况下,“新笔记本”命令不起作用

  FROM debian:stable RUN apt-get update && apt-get install -y wget bzip2 RUN wget https://repo.continuum.io/miniconda/Miniconda2-latest-Linux-x86_64.sh && \ bash Miniconda2-latest-Linux-x86_64.sh -b -p /anaconda2 RUN /anaconda2/bin/conda install jupyter CMD ["/anaconda2/bin/jupyter", "notebook", "--port=8888", "--no-browser", "--ip=0.0.0.0", "--NotebookApp.token=''"] #CMD /anaconda2/bin/jupyter notebook --port=8888 --no-browser --ip=0.0.0.0 --NotebookApp.token='' # docker build -t IMAGE_NAME . # docker run --rm -it -p 8888:8888 IMAGE_NAME 

我真的为此感到困惑,想不出有什么区别!

shell表单 ( CMD abc )使用被parsing的string调用shell,而exec表单( CMD [a, b, c] )直接使用指定的参数启动可执行文件。

由于exec表单中没有shellparsing(在这种情况下,它删除了shell表单中的空引号),所以最后一个参数应该是,例如"--NotebookApp.token=" 。 这是作为--NotebookApp.token=给予程序,没有两个撇号。


从手册:

与shellforms不同,execforms不会调用命令shell。 这意味着正常的shell处理不会发生。 例如,CMD [“echo”,“$ HOME”]不会在$ HOME上进行variablesreplace。 如果你想要shell处理,那么要么使用shell的forms,要么直接执行一个shell,例如:CMD [“sh”,“-c”,“echo $ HOME”]。 当使用exec表单并直接执行一个shell时,就像在shell表单的情况下一样,shell是在执行环境variables扩展,而不是docker。