From 68964bf8f63280f0cb7355108ac1f5e1a62455c9 Mon Sep 17 00:00:00 2001 From: Stefan Proell Date: Tue, 13 Feb 2018 10:36:34 +0100 Subject: Adds a docker--compose file and an environment file for launching Jupyter Notebooks --- .env | 28 +++++++++++++++++++++ README.md | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 15 ++++++++++++ generate_token.py | 17 +++++++++++++ jupyter.pem | 51 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 183 insertions(+) create mode 100644 .env create mode 100644 README.md create mode 100644 docker-compose.yml create mode 100755 generate_token.py create mode 100644 jupyter.pem diff --git a/.env b/.env new file mode 100644 index 0000000..9de96de --- /dev/null +++ b/.env @@ -0,0 +1,28 @@ +# Define a local data directory +# Set permissions for the container: +# sudo chown -R 1000 ${LOCAL_WORKING_DIR} + +LOCAL_WORKING_DIR=/data/jupyter/notebooks + +# Generate an access token like this +# import IPython as IPython +# hash = IPython.lib.passwd("S-E-C-R-E-T") +# print(hash) +# You can use the script generate_token.py + +ACCESS_TOKEN=sha1:d4c78fe19cb5:0c8f830971d52da9d74b9985a8b87a2b80fc6e6a + +# Host port +PORT=8888 + +# Provide data sets +LOCAL_DATASETS=/data/jupyter/datasets + +# Provide local modules +LOCAL_MODULES=/home/git/python_modules + +# SSL +# Generate cert like this: +# openssl req -x509 -nodes -newkey rsa:2048 -keyout jupyter.pem -out jupyter.pem +# Copy the jupyter.pem file into the location below. +LOCAL_SSL_CERTS=/opt/ssl-certs/jupyter diff --git a/README.md b/README.md new file mode 100644 index 0000000..09c333e --- /dev/null +++ b/README.md @@ -0,0 +1,72 @@ +# Jupyter with Docker Compose + +This repository contains a simple docker-compose definition for launching the popular Jupyter Data Science Notebook. +You can define a password with the script ```generate_token.py -p S-E-C-R-E-T``` and generate SSL certificates as described below. + +## Control the container: + +* ```docker-compose up``` mounts the directory and starts the container +* ```docker-compose down``` destroys the container + +## The compose file: docker-compose.yml + +```bash +version: '3' +services: + datascience-notebook: + image: jupyter/datascience-notebook + volumes: + - ${LOCAL_WORKING_DIR}:/home/jovyan/work + - ${LOCAL_DATASETS}:/home/jovyan/work/datasets + - ${LOCAL_MODULES}:/home/jovyan/work/modules + - ${LOCAL_SSL_CERTS}:/etc/ssl/notebook + ports: + - ${PORT}:8888 + container_name: jupyter_notebook + command: "start-notebook.sh \ + --NotebookApp.password=${ACCESS_TOKEN} \ + --NotebookApp.certfile=/etc/ssl/notebook/jupyter.pem" +``` + + +## The environment file .env + +```bash +# Define a local data directory +# Set permissions for the container: +# sudo chown -R 1000 ${LOCAL_WORKING_DIR} + +LOCAL_WORKING_DIR=/data/jupyter/notebooks + +# Generate an access token like this +# import IPython as IPython +# hash = IPython.lib.passwd("S-E-C-R-E-T") +# print(hash) +# You can use the script generate_token.py + +ACCESS_TOKEN=sha1:d4c78fe19cb5:0c8f830971d52da9d74b9985a8b87a2b80fc6e6a + +# Host port +PORT=8888 + +# Provide data sets +LOCAL_DATASETS=/data/jupyter/datasets + +# Provide local modules +LOCAL_MODULES=/home/git/python_modules + +# SSL +# Generate cert like this: +# openssl req -x509 -nodes -newkey rsa:2048 -keyout jupyter.pem -out jupyter.pem +# Copy the jupyter.pem file into the location below. +LOCAL_SSL_CERTS=/opt/ssl-certs/jupyter +``` + + + +# Version Conflicts + +Make sure to have the latest versions installed. You can use the Notebook Browser interface. +```python +pip install -U jupyter +``` diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..8856451 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,15 @@ +version: '3' +services: + datascience-notebook: + image: jupyter/datascience-notebook + volumes: + - ${LOCAL_WORKING_DIR}:/home/jovyan/work + - ${LOCAL_DATASETS}:/home/jovyan/work/datasets + - ${LOCAL_MODULES}:/home/jovyan/work/modules + - ${LOCAL_SSL_CERTS}:/etc/ssl/notebook + ports: + - ${PORT}:8888 + container_name: jupyter_notebook + command: "start-notebook.sh \ + --NotebookApp.password=${ACCESS_TOKEN} \ + --NotebookApp.certfile=/etc/ssl/notebook/jupyter.pem" diff --git a/generate_token.py b/generate_token.py new file mode 100755 index 0000000..54e3c39 --- /dev/null +++ b/generate_token.py @@ -0,0 +1,17 @@ +#!/usr/bin/env sh +import IPython as IPython + +if __name__ == "__main__": + print("Generate a access token") + from argparse import ArgumentParser + parser = ArgumentParser() + parser.add_argument("-p", + "--password", + dest="password", + help="The password you want to use for authentication.", + required=True) + args = parser.parse_args() + + print("\nCopy this line into the .env file:\n") + hash = IPython.lib.passwd(args.password) + print("ACCESS_TOKEN=" + hash) diff --git a/jupyter.pem b/jupyter.pem new file mode 100644 index 0000000..1457bbb --- /dev/null +++ b/jupyter.pem @@ -0,0 +1,51 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDtGlWjn9Sw2aV0 +32H7le8Ra2cQRx5cS/m5R8HL0Tl/JlYwLBXNZcsUmnqOKCxJFilkBcj4BIAic5ZR +b1AyTPn1RERf6SbFLZGBUnYcLQDL6Z6qEILe0H5G30yFjdvjUVnhYPUsWW6H1tUF +EhtuMduj2o+2YUaiE6UQAD5EfX09jzGcwNx/Hj1XXvpRSfDBQWlWxkKOm6TqGoXH +FBAIGAH1gKehotGDd+YluOFp9qk8G2e2Tvpg7JQfaSoIT1ViHwg+0XSQVoVRNqWK +XQ+MD+dCcwbcL7kAbnLW1x1a4ym9as5t/iDUjVldh70coJ9uaa1CHklAZzheH6Xc +up6cvqb5AgMBAAECggEBANa/iV1fwCZFmsRWJsrVq+hdHMXzhB4YeiBES9SstaTi +NiH/a+fTELKij+n9nM69kdOUIcfxW5TYmAc+CKbmbWal5D/yTjk84pL8+xjd8eC+ +wgRKXB4vPJA4Y3h7WfNzlTK6vJTkk2XZQKsNEWcnJUYtCQko5e6aWGA7uCoUdsCv +GPVIgxFpSuAzAVJQVDhcAIVYYeXR8+XF5VDGme0IdN1oOOaNDYvzboBZhWwjIM5c +K309EeY2599Q6HrFK7/eaRLGSoFjQu5WJnQ+CCHp3Awx+5Btc7sYhZHEwi1Qrv+v +RKFLpcICs70pD9/5/QK8PQ57hjfIJdVCr6YkU80EQuECgYEA+BIGzoqTvtrxoTfp +opGZ933fE8f678BEm6WxfhfptZa28M4IJa2wVTfOMp2d8yf03hEhQ5/wc6T2kXmz +PDUq90m2P9dpwUIpQcOH3KGMqtvQ1FS2VikxSm+1u0IzDEWy6Cu1n0OiaAft0aEz +w0MNqVbElK5PrSRZvnfwISwcD2UCgYEA9K6PVsGAaNRMAxZZoHr0cSAjYl1puqi8 +mi9pIZLgM8vjibhHRQWavJ596iTedMa7N+B3/i1YXD6MRETRq3zVqlvvZA+qSWmo +7HTpwsHcLv8XZ0ghvYumxGMv5EhgFc53E5WLkw9x8YiKbrDRhoW7vlDn8pMd6UYA +gKIPFMv0UgUCgYBbX+h587lwN52BUOMSKqeX7hlZY/Qek6ex3Vp/o7dGV/mSwZFm +r4+gFCozorMnebRMh+rEygj7z+uysi0/JCZraA9lfKdLtF8WBjvpHOh/lvBZBcsT ++aBaVsON8lhzUMkRk+gWfgc4YpNLACHc7rn9giRuz7YxhI46BlvBHEpJsQKBgBuz +186+wcccoi6HTUZ6JUrZlKgCY4IasJ/UVlbSxkeXAgAJuSf7ZnWMjD0CR515EqFU +7MD+aU6oVkE0eXis/ZP4LLZrf6AoMlPzOLQwNrmrb/7lj8xiD1OU10tFVnuhkKHL +AK55xTDPgLzfkBlm8satalVwiqZqoovtzT9RiCvxAoGAJpqDya0YvQweh/HMz4O0 +sdOztP0FL/4R6uCx7g2WJCVuS1mT0QH6nTsuvI83Lka1a8g0zZmSBYubaEltwmiY +ZVX0j7kox7fdBDgPGuxnuCFdniChwTGxcQEPmkR9bzbH2ARqs3h+INjQNIXbfY1p +6naHb5lAGVSU06CDnKFQm2c= +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIJAKZ91kk1bQIJMA0GCSqGSIb3DQEBCwUAMIGEMQswCQYD +VQQGEwJBVDEOMAwGA1UECAwFVGlyb2wxEjAQBgNVBAcMCUlubnNicnVjazERMA8G +A1UECgwIQ3JvcHN0ZXIxDDAKBgNVBAsMA0RldjESMBAGA1UEAwwJMTI3LjAuMC4x +MRwwGgYJKoZIhvcNAQkBFg1ub25lQHRlc3Qub3JnMB4XDTE4MDIxMzA4Mzg1M1oX +DTE4MDMxNTA4Mzg1M1owgYQxCzAJBgNVBAYTAkFUMQ4wDAYDVQQIDAVUaXJvbDES +MBAGA1UEBwwJSW5uc2JydWNrMREwDwYDVQQKDAhDcm9wc3RlcjEMMAoGA1UECwwD +RGV2MRIwEAYDVQQDDAkxMjcuMC4wLjExHDAaBgkqhkiG9w0BCQEWDW5vbmVAdGVz +dC5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDtGlWjn9Sw2aV0 +32H7le8Ra2cQRx5cS/m5R8HL0Tl/JlYwLBXNZcsUmnqOKCxJFilkBcj4BIAic5ZR +b1AyTPn1RERf6SbFLZGBUnYcLQDL6Z6qEILe0H5G30yFjdvjUVnhYPUsWW6H1tUF +EhtuMduj2o+2YUaiE6UQAD5EfX09jzGcwNx/Hj1XXvpRSfDBQWlWxkKOm6TqGoXH +FBAIGAH1gKehotGDd+YluOFp9qk8G2e2Tvpg7JQfaSoIT1ViHwg+0XSQVoVRNqWK +XQ+MD+dCcwbcL7kAbnLW1x1a4ym9as5t/iDUjVldh70coJ9uaa1CHklAZzheH6Xc +up6cvqb5AgMBAAGjUDBOMB0GA1UdDgQWBBS0HEgRO22ECtLckZp+LP+0nNg8SzAf +BgNVHSMEGDAWgBS0HEgRO22ECtLckZp+LP+0nNg8SzAMBgNVHRMEBTADAQH/MA0G +CSqGSIb3DQEBCwUAA4IBAQCtdBrbmYNZCw/zpxe81VHH5be3XGw/VFOmTTDdWi6O +q9RHoHpwDWsJd1T0h/o5wzkpIFGADPQCtR7SGktoUS40GUmaiQXQijedGSMg56YN +f/NwLm/zf93i3gbnK8l/zNb7BtEPzR/46nezlWRxs57Iw2Kw2bFQA8SKjlbqllhf +KlDgu8QaFxnoaIuMcZKDIGlEeO0wnEzqjDF438aAt/ft0SPs7ae6PokR2YhMO2SK +0d9IrVqF74lls3Kmddkt8mIbk77B4eRtmB28M/hMVUcun3598qfK77OsK+bm2AEc +krn3a6vyCg6oV/i4icbIHHLNXvHUSoZ20h43NPZ/3eW5 +-----END CERTIFICATE----- -- cgit v1.2.3