C'est la première fois que j'utilise Docker. J'essaye d'installer jupyter et d'exécuter un fichier ipynb.
J'ai essayé 2 images et j'ai rencontré la même erreur sur les deux:
1) python: 3.6.2-slim
2) jupyter / datascience-notebook
Dockerfile:
COPY jupyter_notebook_config.py /config/location/jupyter_notebook_config.py
Build:
c.NotebookApp.ip = â0.0.0.0â
Exécuter:
#c.NotebookApp.ip = â*â
J'obtiens l'erreur suivante:
jupyter notebook --generate-config
Je pense qu'une solution potentielle à ce problème consiste à mettre à jour le fichier jupyter_notebook_config.py. Je dois donc générer le fichier en utilisant:
Traceback (most recent call last):
File "/opt/conda/lib/python3.6/site-packages/traitlets/traitlets.py", line 528, in get
value = obj._trait_values[self.name]
KeyError: 'allow_remote_access'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/opt/conda/lib/python3.6/site-packages/notebook/notebookapp.py", line 869, in _default_allow_remote
addr = ipaddress.ip_address(self.ip)
File "/opt/conda/lib/python3.6/ipaddress.py", line 54, in ip_address
address)
ValueError: '' does not appear to be an IPv4 or IPv6 address
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/opt/conda/bin/jupyter-notebook", line 11, in <module>
sys.exit(main())
File "/opt/conda/lib/python3.6/site-packages/jupyter_core/application.py", line 266, in launch_instance
return super(JupyterApp, cls).launch_instance(argv=argv, **kwargs)
File "/opt/conda/lib/python3.6/site-packages/traitlets/config/application.py", line 657, in launch_instance
app.initialize(argv)
File "<decorator-gen-7>", line 2, in initialize
File "/opt/conda/lib/python3.6/site-packages/traitlets/config/application.py", line 87, in catch_config_error
return method(app, *args, **kwargs)
File "/opt/conda/lib/python3.6/site-packages/notebook/notebookapp.py", line 1629, in initialize
self.init_webapp()
File "/opt/conda/lib/python3.6/site-packages/notebook/notebookapp.py", line 1379, in init_webapp
self.jinja_environment_options,
File "/opt/conda/lib/python3.6/site-packages/notebook/notebookapp.py", line 158, in __init__
default_url, settings_overrides, jinja_env_options)
File "/opt/conda/lib/python3.6/site-packages/notebook/notebookapp.py", line 251, in init_settings
allow_remote_access=jupyter_app.allow_remote_access,
File "/opt/conda/lib/python3.6/site-packages/traitlets/traitlets.py", line 556, in __get__
return self.get(obj, cls)
File "/opt/conda/lib/python3.6/site-packages/traitlets/traitlets.py", line 535, in get
value = self._validate(obj, dynamic_default())
File "/opt/conda/lib/python3.6/site-packages/notebook/notebookapp.py", line 872, in _default_allow_remote
for info in socket.getaddrinfo(self.ip, self.port, 0, socket.SOCK_STREAM):
File "/opt/conda/lib/python3.6/socket.py", line 745, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name or service not known
Je dois décommenter
docker run -p 9999:8888 helloworld_container
et le définir sur: p>
docker build -t helloworld_container .
Je sais comment effectuer ces étapes sur ma machine mais je ne sais pas comment effectuer ces étapes sur l'image. J'ai donc généré le fichier de configuration sur ma machine, effectué les modifications puis l'ai copié dans le conteneur en ajoutant la ligne suivante au dockerfile (et en créant un nouveau conteneur):
#Use this python image FROM python:3.6.2-slim #Set metadata LABEL maintainer="MyName" #Set working directory to /app WORKDIR /app #Copy all files in current directory to working directory (/app) COPY . /app #Install the required libraries RUN pip --no-cache-dir install numpy pandas seaborn sklearn jupyter #Make port 8888 available to the world outside this Container EXPOSE 8888 #Run jupyter when container launches CMD ["jupyter","notebook","--ip='*'","--port=8888","--no-browser","--allow-root"]
Cela n'a pas résolu le problème.
Pour l'instant, je suis passé à une autre image (tensorflow \ tensorflow) sur laquelle jupyter est installé mais je veux savoir ce que je fais de mal.
3 Réponses :
Au hasard, cette ligne, en particulier, le "--ip = '*'" est le problème:
CMD["/bin/bash", "-lc", "jupyter notebook --ip=0.0.0.0 --port=8888 --no-browser --allow-root"]
Je ne sais pas comment Les fichiers docker gèrent les échappements, mais l'erreur indique que l'adresse IP est en quelque sorte erronée:
ValueError: '' does not appear to be an IPv4 or IPv6 address
Essayez plutôt ceci, et encore moins les problèmes d'échappement:
CMD ["jupyter","notebook","--ip='*'","--port=8888","--no-browser","--allow-root"]
Vous avez déjà identifié le problème vous-même dans la mesure où vous avez remarqué que vous deviez remplacer * par 0.0.0.0 . Mais au lieu de faire cela dans la configuration, vous pouvez simplement le faire dans votre commande (pas besoin d'utiliser bash):
CMD ["jupyter", "notebook", "--ip = 0.0.0.0", "--port = 8888", "--no-browser", "--allow-root"]
Il s'agit d'un problème qui a été introduit par un bogue dans le notebook et également signalé dans docker-stacks .
Je voulais exécuter des blocs-notes Jupyter à l'aide de Docker et j'ai rencontré le même problème que vous avez signalé. Heureusement, j'ai pu trouver une solution.
Remarque: J'utilise le continuumio / anaconda3 image.
docker run --volume /path/in/your/host/jupyter_notebooks:/opt/notebooks --rm -it -p 8888:8888 continuumio/anaconda3 /bin/bash -c "/opt/conda/bin/conda install jupyter -y --quiet && /opt/conda/bin/jupyter notebook --notebook-dir=/opt/notebooks --ip='0.0.0.0' --port=8888 --no-browser --allow-root"
docker run -i -t -p 8888:8888 continuumio/anaconda3 /bin/bash -c "/opt/conda/bin/conda install jupyter -y --quiet && mkdir /opt/notebooks && /opt/conda/bin/jupyter notebook --notebook-dir=/opt/notebooks --ip='0.0.0.0' --port=8888 --no-browser --allow-root"
Il y a deux modifications cruciales pour que cela fonctionne. D'abord , utilisez --ip = '0.0.0.0 ' au lieu de --ip =' * '. Ensuite, ajoutez --allow-root pour voir les notebooks en cours d'exécution dans le navigateur.
Si vous souhaitez créer un conteneur temporel, c'est-à-dire qui est supprimé une fois qu'il cesse de fonctionner, et que vous souhaitez créer un volume afin de pouvoir conserver, dans votre hôte, les fichiers que vous avez créés à l'intérieur du conteneur, utilisez la commande suivante:
XXX
J'ai ajouté une réponse à votre question.