[
  {
    "path": "README.md",
    "content": "# Jupyter with Docker Compose\n\nThis repository contains a simple docker-compose definition for launching the popular Jupyter Data Science Notebook.\nYou can define a password with the script ```generate_token.py -p S-E-C-R-E-T``` and generate SSL certificates as described below.\n\n## Control the container:\n\n* ```docker-compose up``` mounts the directory and starts the container\n* ```docker-compose down``` destroys the container\n\n## The compose file: docker-compose.yml\n\n```bash\nversion:  '3'\nservices:\n  datascience-notebook:\n      image:    jupyter/datascience-notebook\n      volumes:\n        - ${LOCAL_WORKING_DIR}:/home/jovyan/work\n        - ${LOCAL_DATASETS}:/home/jovyan/work/datasets\n        - ${LOCAL_MODULES}:/home/jovyan/work/modules\n        - ${LOCAL_SSL_CERTS}:/etc/ssl/notebook\n      ports:\n        - ${PORT}:8888\n      container_name:   jupyter_notebook\n      command: \"start-notebook.sh \\\n        --NotebookApp.password=${ACCESS_TOKEN} \\\n        --NotebookApp.certfile=/etc/ssl/notebook/jupyter.pem\"\n```\n\n## Example with a custom user\n\n```YAML\nversion: '2'\nservices:\n    datascience-notebook:\n        image: jupyter/base-notebook:latest\n        volumes:\n            - /tmp/jupyter_test_dir:/home/docker_worker/work            \n        ports:\n            - 8891:8888\n        command: \"start-notebook.sh\"\n        user: root\n        environment:\n          NB_USER: docker_worker\n          NB_UID: 1008\n          NB_GID: 1011\n          CHOWN_HOME: 'yes'\n          CHOWN_HOME_OPTS: -R\n\n```\n## The environment file .env\n\n```bash\n# Define a local data directory\n# Set permissions for the container:\n#   sudo chown -R 1000 ${LOCAL_WORKING_DIR}\n\nLOCAL_WORKING_DIR=/data/jupyter/notebooks\n\n# Generate an access token like this\n#   import IPython as IPython\n#   hash = IPython.lib.passwd(\"S-E-C-R-E-T\")\n#   print(hash)\n# You can use the script generate_token.py\n\nACCESS_TOKEN=sha1:d4c78fe19cb5:0c8f830971d52da9d74b9985a8b87a2b80fc6e6a\n\n# Host port\nPORT=8888\n\n# Provide data sets\nLOCAL_DATASETS=/data/jupyter/datasets\n\n# Provide local modules\nLOCAL_MODULES=/home/git/python_modules\n\n# SSL\n# Generate cert like this:\n#   openssl req -x509 -nodes -newkey rsa:2048 -keyout jupyter.pem -out jupyter.pem\n# Copy the jupyter.pem file into the location below.\nLOCAL_SSL_CERTS=/opt/ssl-certs/jupyter\n```\n\n\n\n# Version Conflicts\n\nMake sure to have the latest versions installed. You can use the Notebook Browser interface.\n```python\npip install -U jupyter\n```\n"
  },
  {
    "path": "docker-compose.yml",
    "content": "version:  '3'\nservices:\n  datascience-notebook:\n      image:    jupyter/datascience-notebook\n      volumes:\n        - ${LOCAL_WORKING_DIR}:/home/jovyan/work\n        - ${LOCAL_DATASETS}:/home/jovyan/work/datasets\n        - ${LOCAL_MODULES}:/home/jovyan/work/modules\n        - ${LOCAL_SSL_CERTS}:/etc/ssl/notebook\n      ports:\n        - ${PORT}:8888\n      container_name:   jupyter_notebook\n      command: \"start-notebook.sh \\\n        --NotebookApp.password=${ACCESS_TOKEN} \\\n        --NotebookApp.certfile=/etc/ssl/notebook/jupyter.pem\"\n"
  },
  {
    "path": "generate_token.py",
    "content": "#!/usr/bin/env sh\nimport IPython as IPython\n\nif __name__ == \"__main__\":\n    print(\"Generate a access token\")\n    from argparse import ArgumentParser\n    parser = ArgumentParser()\n    parser.add_argument(\"-p\",\n        \"--password\", \n        dest=\"password\",\n        help=\"The password you want to use for authentication.\",\n        required=True)\n    args = parser.parse_args()\n\n    print(\"\\nCopy this line into the .env file:\\n\")\n    hash = IPython.lib.passwd(args.password)\n    print(\"ACCESS_TOKEN=\" + hash)\n"
  },
  {
    "path": "jupyter.pem",
    "content": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDtGlWjn9Sw2aV0\n32H7le8Ra2cQRx5cS/m5R8HL0Tl/JlYwLBXNZcsUmnqOKCxJFilkBcj4BIAic5ZR\nb1AyTPn1RERf6SbFLZGBUnYcLQDL6Z6qEILe0H5G30yFjdvjUVnhYPUsWW6H1tUF\nEhtuMduj2o+2YUaiE6UQAD5EfX09jzGcwNx/Hj1XXvpRSfDBQWlWxkKOm6TqGoXH\nFBAIGAH1gKehotGDd+YluOFp9qk8G2e2Tvpg7JQfaSoIT1ViHwg+0XSQVoVRNqWK\nXQ+MD+dCcwbcL7kAbnLW1x1a4ym9as5t/iDUjVldh70coJ9uaa1CHklAZzheH6Xc\nup6cvqb5AgMBAAECggEBANa/iV1fwCZFmsRWJsrVq+hdHMXzhB4YeiBES9SstaTi\nNiH/a+fTELKij+n9nM69kdOUIcfxW5TYmAc+CKbmbWal5D/yTjk84pL8+xjd8eC+\nwgRKXB4vPJA4Y3h7WfNzlTK6vJTkk2XZQKsNEWcnJUYtCQko5e6aWGA7uCoUdsCv\nGPVIgxFpSuAzAVJQVDhcAIVYYeXR8+XF5VDGme0IdN1oOOaNDYvzboBZhWwjIM5c\nK309EeY2599Q6HrFK7/eaRLGSoFjQu5WJnQ+CCHp3Awx+5Btc7sYhZHEwi1Qrv+v\nRKFLpcICs70pD9/5/QK8PQ57hjfIJdVCr6YkU80EQuECgYEA+BIGzoqTvtrxoTfp\nopGZ933fE8f678BEm6WxfhfptZa28M4IJa2wVTfOMp2d8yf03hEhQ5/wc6T2kXmz\nPDUq90m2P9dpwUIpQcOH3KGMqtvQ1FS2VikxSm+1u0IzDEWy6Cu1n0OiaAft0aEz\nw0MNqVbElK5PrSRZvnfwISwcD2UCgYEA9K6PVsGAaNRMAxZZoHr0cSAjYl1puqi8\nmi9pIZLgM8vjibhHRQWavJ596iTedMa7N+B3/i1YXD6MRETRq3zVqlvvZA+qSWmo\n7HTpwsHcLv8XZ0ghvYumxGMv5EhgFc53E5WLkw9x8YiKbrDRhoW7vlDn8pMd6UYA\ngKIPFMv0UgUCgYBbX+h587lwN52BUOMSKqeX7hlZY/Qek6ex3Vp/o7dGV/mSwZFm\nr4+gFCozorMnebRMh+rEygj7z+uysi0/JCZraA9lfKdLtF8WBjvpHOh/lvBZBcsT\n+aBaVsON8lhzUMkRk+gWfgc4YpNLACHc7rn9giRuz7YxhI46BlvBHEpJsQKBgBuz\n186+wcccoi6HTUZ6JUrZlKgCY4IasJ/UVlbSxkeXAgAJuSf7ZnWMjD0CR515EqFU\n7MD+aU6oVkE0eXis/ZP4LLZrf6AoMlPzOLQwNrmrb/7lj8xiD1OU10tFVnuhkKHL\nAK55xTDPgLzfkBlm8satalVwiqZqoovtzT9RiCvxAoGAJpqDya0YvQweh/HMz4O0\nsdOztP0FL/4R6uCx7g2WJCVuS1mT0QH6nTsuvI83Lka1a8g0zZmSBYubaEltwmiY\nZVX0j7kox7fdBDgPGuxnuCFdniChwTGxcQEPmkR9bzbH2ARqs3h+INjQNIXbfY1p\n6naHb5lAGVSU06CDnKFQm2c=\n-----END PRIVATE KEY-----\n-----BEGIN CERTIFICATE-----\nMIID3TCCAsWgAwIBAgIJAKZ91kk1bQIJMA0GCSqGSIb3DQEBCwUAMIGEMQswCQYD\nVQQGEwJBVDEOMAwGA1UECAwFVGlyb2wxEjAQBgNVBAcMCUlubnNicnVjazERMA8G\nA1UECgwIQ3JvcHN0ZXIxDDAKBgNVBAsMA0RldjESMBAGA1UEAwwJMTI3LjAuMC4x\nMRwwGgYJKoZIhvcNAQkBFg1ub25lQHRlc3Qub3JnMB4XDTE4MDIxMzA4Mzg1M1oX\nDTE4MDMxNTA4Mzg1M1owgYQxCzAJBgNVBAYTAkFUMQ4wDAYDVQQIDAVUaXJvbDES\nMBAGA1UEBwwJSW5uc2JydWNrMREwDwYDVQQKDAhDcm9wc3RlcjEMMAoGA1UECwwD\nRGV2MRIwEAYDVQQDDAkxMjcuMC4wLjExHDAaBgkqhkiG9w0BCQEWDW5vbmVAdGVz\ndC5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDtGlWjn9Sw2aV0\n32H7le8Ra2cQRx5cS/m5R8HL0Tl/JlYwLBXNZcsUmnqOKCxJFilkBcj4BIAic5ZR\nb1AyTPn1RERf6SbFLZGBUnYcLQDL6Z6qEILe0H5G30yFjdvjUVnhYPUsWW6H1tUF\nEhtuMduj2o+2YUaiE6UQAD5EfX09jzGcwNx/Hj1XXvpRSfDBQWlWxkKOm6TqGoXH\nFBAIGAH1gKehotGDd+YluOFp9qk8G2e2Tvpg7JQfaSoIT1ViHwg+0XSQVoVRNqWK\nXQ+MD+dCcwbcL7kAbnLW1x1a4ym9as5t/iDUjVldh70coJ9uaa1CHklAZzheH6Xc\nup6cvqb5AgMBAAGjUDBOMB0GA1UdDgQWBBS0HEgRO22ECtLckZp+LP+0nNg8SzAf\nBgNVHSMEGDAWgBS0HEgRO22ECtLckZp+LP+0nNg8SzAMBgNVHRMEBTADAQH/MA0G\nCSqGSIb3DQEBCwUAA4IBAQCtdBrbmYNZCw/zpxe81VHH5be3XGw/VFOmTTDdWi6O\nq9RHoHpwDWsJd1T0h/o5wzkpIFGADPQCtR7SGktoUS40GUmaiQXQijedGSMg56YN\nf/NwLm/zf93i3gbnK8l/zNb7BtEPzR/46nezlWRxs57Iw2Kw2bFQA8SKjlbqllhf\nKlDgu8QaFxnoaIuMcZKDIGlEeO0wnEzqjDF438aAt/ft0SPs7ae6PokR2YhMO2SK\n0d9IrVqF74lls3Kmddkt8mIbk77B4eRtmB28M/hMVUcun3598qfK77OsK+bm2AEc\nkrn3a6vyCg6oV/i4icbIHHLNXvHUSoZ20h43NPZ/3eW5\n-----END CERTIFICATE-----\n"
  }
]