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.