2017-02-20 9 views
2

Когда команда задана как CMD a b c, все работает так, как ожидалось, указывая ту же команду с CMD ["a", "b", "c"] - это дает неожиданный результат. Я пытаюсь запустить Jupyter (ipython) внутри докера. Моя команда CMD должна запустить ее. Кажется, что независимо от того, как я это определяю, начинается Jupyter. Но, только если я укажу его как CMD a b c, jupyter действительно работает правильно, и можно запустить ядро. В этом случае «New Notebook» команда работаетDocker `CMD a b c` VS` CMD ["a", "b", "c"] `

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 

В этом случае «New Notebook» команда не работает

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 

Я действительно озадачен этим, не могу думать о том, что может быть разницей!

ответ

5

shell form (CMD a b c) вызывает оболочку со строкой, которая разобранная в то время как Exec форма (CMD [a, b, c]) запускает исполняемый файл непосредственно с указанными аргументами.

Поскольку нет оболочки разбора в ехесе формы (которая, в этом случае, удалить пустые кавычки в виде оболочки), последний параметр должен быть, например., "--NotebookApp.token=". Это предоставляется программе как --NotebookApp.token=, без двух апострофов.


Из инструкции:

В отличие от формы оболочки, ехес форма не вызывает командную оболочку. Это означает, что нормальной обработки оболочки не происходит. Например, CMD ["echo", "$ HOME"] не будет делать замену переменных в $ HOME. Если вы хотите обработать оболочку, то либо используйте форму оболочки, либо выполните оболочку напрямую, например: CMD ["sh", "-c", "echo $ HOME"]. При использовании формы exec и непосредственного выполнения оболочки, как и в случае с оболочкой, это оболочка, которая выполняет расширение переменной среды, а не докер.

+0

tbh, я подозревал что-то в этом роде. Я даже пробовал 'CMD [" bash "," a "," b "," c "]' - но, видимо, это должно было быть 'CMD [" bash "," abc "]' – avloss

+1

@avloss 'CMD ["bash", "-c", "abc"] ' – Matt

+0

Спасибо! ну, на самом деле 'CMD [" bash "," -c "," a b c "]' не сработало! Но 'CMD [" sh "," -c "," a b c "]' did! Поэтому 'jupyter' полагается на некоторые« env' vars, кажется, и их нет в 'bash'. – avloss

Смежные вопросы