73923


以下のDockerfileを作成しているのですが、`docker build -t notebook`を実行すると  
19行目のNotebookApp.tokenのところでエラーが出てしまいます。そこをコメントアウトするとbuildは通ります。  
誰かご教授いただけると幸いです。

[code]

    FROM jupyter/tensorflow-notebook
    
    USER root
    #for vscode extention
    RUN apt-get -y update && \
        apt-get -y install curl
    RUN curl -fsSL https://code-server.dev/install.sh | sh
    RUN code-server \
      --install-extension ms-python.python \
      --install-extension ms-ceintl.vscode-language-pack-ja
    
    #for python libraries
    RUN pip install --upgrade pip
    
    RUN pip install seaborn && \
        pip install japanize-matplotlib
    
    RUN sed -i 's/# c.NotebookApp.ip = 'localhost'/c.NotebookApp.ip = '0.0.0.0'/' /home/jovyan/.jupyter/jupyter_notebook_config.py
    RUN sed -i 's/# c.NotebookApp.token = '<generated>'/c.NotebookApp.token = 'token'/' /home/jovyan/.jupyter/jupyter_notebook_config.py
    RUN sed -i 's/# c.NotebookApp.disable_check_xsrf = False/c.NotebookApp.disable_check_xsrf = True/' /home/jovyan/.jupyter/jupyter_notebook_config.py
    RUN sed -i 's/# c.NotebookApp.port = 8888/c.NotebookApp.port = 8888/' /home/jovyan/.jupyter/jupyter_notebook_config.py
    
    ADD run.sh /opt/run.sh
    RUN chmod 700 /opt/run.sh
    
    WORKDIR /workdir
    CMD /opt/run.sh
    
[/code]


CC BY-SA 4.0
2021-02-10T17:44:37.207
73922
2021-02-11T00:20:55.867
29536
question
docker sed
Dockerfileにてsedエラー generated: No such file or directory


この sed では、たとえば `s/# c.NotebookApp.ip = 'localhost'/c.NotebookApp.ip =
'0.0.0.0'/` をひとつ目の文字列として渡そうとしているのだと思いますが、実際にはこの文字列の中にシングルクォート `'`
が含まれているのに文字列自体もシングルクォートで囲おうとしているため意図しない結果になっています。

このため、`"s/# c.NotebookApp.ip = 'localhost'/c.NotebookApp.ip = '0.0.0.0'/"`
のようにダブルクォートで妥協するか、`'s/# c.NotebookApp.ip = '\''localhost'\''/c.NotebookApp.ip
= '\''0.0.0.0'\''/'` のようにシングルクォートの外でエスケープ済みのシングルクォートを書くことで回避してください。


CC BY-SA 4.0
2021-02-10T19:25:14.220
73923
2021-02-10T19:25:14.220
19110
73922
answer


sed コマンドのアドレス指定(`/regexp/`)+置換(`s///`)を用いて以下の様に書くこともできます。

[code]

    sed -i -E '/^# c.NotebookApp.ip /{s/^# //;s/localhost/0.0.0.0/;}' jupyter_notebook_config.py
    sed -i -E '/^# c.NotebookApp.token /{s/^# //;s/<generated>/token/;}' jupyter_notebook_config.py
    sed -i -E '/^# c.NotebookApp.disable_check_xsrf /{s/^# //;s/False/True/;}' jupyter_notebook_config.py
    sed -i -E '/^# c.NotebookApp.port /s/^# //' jupyter_notebook_config.py
    
[/code]

**実行結果**

[code]

    $ cp -pv jupyter_notebook_config.py jupyter_notebook_config.py.org
    
    ## edit by sed command
    
    $ diff -u jupyter_notebook_config.py.org jupyter_notebook_config.py
    --- jupyter_notebook_config.py.org  1971-01-01 09:49:39.118837629 +0900
    +++ jupyter_notebook_config.py  1971-01-01 09:49:28.514267925 +0900
    @@ -223,7 +223,7 @@
     #  authentication and security checks, with the full knowledge of what that
     #  implies.
     #  Default: False
    -# c.NotebookApp.disable_check_xsrf = False
    +c.NotebookApp.disable_check_xsrf = True
     
     ## Whether to enable MathJax for typesetting math/TeX
     #  
    @@ -282,7 +282,7 @@
     
     ## ノートブックサーバが待ち受ける IP アドレス。
     #  Default: 'localhost'
    -# c.NotebookApp.ip = 'localhost'
    +c.NotebookApp.ip = '0.0.0.0'
     
     ## Jinja environment に渡される追加の引数を指定します。
     #  Default: {}
    @@ -406,7 +406,7 @@
     
     ## The port the notebook server will listen on (env: JUPYTER_PORT).
     #  Default: 8888
    -# c.NotebookApp.port = 8888
    +c.NotebookApp.port = 8888
     
     ## The number of additional ports to try if the specified port is not available
     #  (env: JUPYTER_PORT_RETRIES).
    @@ -493,7 +493,7 @@
     #  Setting to an empty string disables authentication altogether, which is NOT
     #  RECOMMENDED.
     #  Default: '<generated>'
    -# c.NotebookApp.token = '<generated>'
    +c.NotebookApp.token = 'token'
    
[/code]


CC BY-SA 4.0
2021-02-11T00:20:55.867
73924
2021-02-11T00:20:55.867
73922
answer