From 1504c19ba81b534235fa3546791b993b5c499b98 Mon Sep 17 00:00:00 2001 From: iameskild Date: Mon, 30 May 2022 15:57:48 -0700 Subject: [PATCH 01/27] Initial transfer, minor clean up --- .github/workflows/image.yaml | 135 +++++++++++++ Dockerfile.dask-worker | 31 +++ Dockerfile.jupyterhub | 32 +++ Dockerfile.jupyterlab | 53 +++++ README.md | 22 +++ dask-worker/environment.yaml | 6 + dask-worker/postBuild | 23 +++ docker-bake.json | 45 +++++ jupyterhub/environment.yaml | 14 ++ jupyterhub/postBuild | 2 + jupyterlab/apt.txt | 29 +++ jupyterlab/conda-linux-64.lock | 286 +++++++++++++++++++++++++++ jupyterlab/environment.yaml | 56 ++++++ jupyterlab/postBuild | 15 ++ scripts/fix-permissions | 12 ++ scripts/install-apt-minimal.sh | 4 + scripts/install-apt.sh | 12 ++ scripts/install-conda-environment.sh | 55 ++++++ scripts/install-conda.sh | 37 ++++ 19 files changed, 869 insertions(+) create mode 100644 .github/workflows/image.yaml create mode 100644 Dockerfile.dask-worker create mode 100644 Dockerfile.jupyterhub create mode 100644 Dockerfile.jupyterlab create mode 100644 dask-worker/environment.yaml create mode 100755 dask-worker/postBuild create mode 100644 docker-bake.json create mode 100644 jupyterhub/environment.yaml create mode 100755 jupyterhub/postBuild create mode 100644 jupyterlab/apt.txt create mode 100644 jupyterlab/conda-linux-64.lock create mode 100644 jupyterlab/environment.yaml create mode 100755 jupyterlab/postBuild create mode 100755 scripts/fix-permissions create mode 100755 scripts/install-apt-minimal.sh create mode 100755 scripts/install-apt.sh create mode 100755 scripts/install-conda-environment.sh create mode 100755 scripts/install-conda.sh diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml new file mode 100644 index 0000000..d759cf1 --- /dev/null +++ b/.github/workflows/image.yaml @@ -0,0 +1,135 @@ +name: "Build Docker Images" + +on: + create: # Branch (so that the Docker image tags exist for a new branch when pushed) + # even if nothing on 'paths' below is changed. + branches: + - '**' + + push: + paths: + - "qhub/template/image/**" + - ".github/workflows/image.yaml" + + branches: # Only on paths above + - '**' + + tags: # Always, regardless of paths above + - '*' + +permissions: + contents: read + packages: write + id-token: write + security-events: write + +jobs: + jupyterlab: + name: 'Build Docker Images' + runs-on: ubuntu-latest + strategy: + matrix: + dockerfile: + - jupyterlab + - jupyterhub + - dask-worker + steps: + - name: 'Checkout Infrastructure' + uses: actions/checkout@main + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Login to DockerHub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Login to GitHub Container Registry + if: github.event_name != 'pull_request' + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Login to Quay Container Registry + if: github.event_name != 'pull_request' + uses: docker/login-action@v1 + with: + registry: quay.io + username: ${{ secrets.QUAY_USERNAME }} + password: ${{ secrets.QUAY_TOKEN }} + + - name: Lint Dockerfiles + uses: jbergstroem/hadolint-gh-action@v1 + with: + dockerfile: Dockerfile.${{ matrix.dockerfile }} + output_format: tty + error_level: 0 + + - name: Docker meta + id: meta + uses: crazy-max/ghaction-docker-meta@v2 + with: + # list of Docker images to use as base name for tags + images: | + "quansight/qhub-${{ matrix.dockerfile }}" + # generate Docker tags based on the following events/attributes + tags: | + type=ref,event=branch + type=ref,event=tag + type=sha + + - name: Inspect image dir tree + run: | + sudo apt-get install tree + tree . + + - name: Set tag var + id: var + run: echo ::set-output name=docker_tag::$(echo "${{ steps.meta.outputs.tags }}" | sed -n 1p) + + - name: Build docker + uses: docker/build-push-action@v2 + with: + # context: "./qhub/template/image" + file: "Dockerfile.${{ matrix.dockerfile }}" + tags: | + ${{ steps.meta.outputs.tags }} + ghcr.io/${{ steps.meta.outputs.tags }} + quay.io/${{ steps.meta.outputs.tags }} + push: ${{ github.event_name != 'pull_request' }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + + - uses: actions/cache@v2.1.4 + if: ${{ github.event_name == 'pull_request' }} + with: + path: .trivy + key: ${{ runner.os }}-trivy-${{ github.run_id }} + restore-keys: | + ${{ runner.os }}-trivy- + + - name: Run Trivy vulnerability scanner + if: ${{ github.event_name == 'pull_request' }} + uses: aquasecurity/trivy-action@master + with: + image-ref: ${{ steps.var.outputs.docker_tag }} + format: 'sarif' + output: 'trivy-results.sarif' + severity: 'CRITICAL,HIGH' + ignore-unfixed: true + cache-dir: .trivy + + - name: Upload Trivy scan results to GitHub Security tab + if: ${{ github.event_name == 'pull_request' }} + uses: github/codeql-action/upload-sarif@v1 + with: + sarif_file: 'trivy-results.sarif' + + - name: Correct Trivy cache permissions + if: ${{ github.event_name == 'pull_request' }} + run: sudo chown -R $USER:$GROUP .trivy diff --git a/Dockerfile.dask-worker b/Dockerfile.dask-worker new file mode 100644 index 0000000..02a5905 --- /dev/null +++ b/Dockerfile.dask-worker @@ -0,0 +1,31 @@ +FROM ubuntu:20.04 +LABEL MAINTAINER="Quansight" + +COPY scripts/install-apt-minimal.sh /opt/scripts/install-apt-minimal.sh +RUN /opt/scripts/install-apt-minimal.sh + +COPY scripts/fix-permissions /opt/scripts/fix-permissions + +ENV CONDA_VERSION py37_4.10.3 +ENV CONDA_SHA256 a1a7285dea0edc430b2bc7951d89bb30a2a1b32026d2a7b02aacaaa95cf69c7c +SHELL ["/bin/bash", "-c"] + +ENV PATH=/opt/conda/bin:${PATH}:/opt/scripts + +# ============== base install =============== +COPY scripts/install-conda.sh /opt/scripts/install-conda.sh + +RUN /opt/scripts/install-conda.sh + +# ========== dask-worker install =========== +COPY dask-worker/environment.yaml /opt/dask-worker/environment.yaml +COPY scripts/install-conda-environment.sh /opt/scripts/install-conda-environment.sh +RUN /opt/scripts/install-conda-environment.sh /opt/dask-worker/environment.yaml 'false' + +# ========== Setup GPU Paths ============ +ENV LD_LIBRARY_PATH=/usr/local/nvidia/lib64 +ENV NVIDIA_PATH=/usr/local/nvidia/bin +ENV PATH="$NVIDIA_PATH:$PATH" + +COPY dask-worker /opt/dask-worker +RUN /opt/dask-worker/postBuild diff --git a/Dockerfile.jupyterhub b/Dockerfile.jupyterhub new file mode 100644 index 0000000..796b0e4 --- /dev/null +++ b/Dockerfile.jupyterhub @@ -0,0 +1,32 @@ +FROM ubuntu:20.04 +LABEL MAINTAINER="Quansight" + +COPY scripts/install-apt-minimal.sh /opt/scripts/install-apt-minimal.sh +RUN /opt/scripts/install-apt-minimal.sh + +COPY scripts/fix-permissions /opt/scripts/fix-permissions + +ENV CONDA_VERSION py37_4.10.3 +ENV CONDA_SHA256 a1a7285dea0edc430b2bc7951d89bb30a2a1b32026d2a7b02aacaaa95cf69c7c +SHELL ["/bin/bash", "-c"] + +ENV PATH="/opt/conda/bin:$PATH:/opt/scripts" + +# ============== base install =============== +COPY scripts/install-conda.sh /opt/scripts/install-conda.sh +RUN /opt/scripts/install-conda.sh + +# ========== jupyterhub install =========== +COPY jupyterhub/environment.yaml /opt/jupyterhub/environment.yaml +COPY scripts/install-conda-environment.sh /opt/scripts/install-conda-environment.sh +RUN /opt/scripts/install-conda-environment.sh /opt/jupyterhub/environment.yaml 'false' + +COPY jupyterhub /opt/jupyterhub +RUN /opt/jupyterhub/postBuild + +WORKDIR /srv/jupyterhub + +# So we can actually write a db file here +RUN fix-permissions /srv/jupyterhub + +CMD ["jupyterhub", "--config", "/usr/local/etc/jupyterhub/jupyterhub_config.py"] diff --git a/Dockerfile.jupyterlab b/Dockerfile.jupyterlab new file mode 100644 index 0000000..1592297 --- /dev/null +++ b/Dockerfile.jupyterlab @@ -0,0 +1,53 @@ +FROM ubuntu:20.04 +LABEL MAINTAINER="Quansight" + +ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 +RUN chmod -R a-w ~ +COPY scripts/install-apt-minimal.sh /opt/scripts/install-apt-minimal.sh +RUN /opt/scripts/install-apt-minimal.sh + +COPY scripts/fix-permissions /opt/scripts/fix-permissions + +ENV CONDA_VERSION py37_4.10.3 +ENV CONDA_SHA256 a1a7285dea0edc430b2bc7951d89bb30a2a1b32026d2a7b02aacaaa95cf69c7c +SHELL ["/bin/bash", "-c"] +ENV CONDA_DIR=/opt/conda \ + DEFAULT_ENV=default +# Set timezone +ENV TZ=America/Chicago +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +# Set PATH for Dockerfile so that conda works and some useful scripts are +# available. Any changes intended to propagate to runtime containers should be +# set in /etc/profile.d (see setup_shell_behavior.sh) +ENV PATH=/opt/conda/envs/${DEFAULT_ENV}/bin:/opt/conda/bin:${PATH}:/opt/scripts + +# ============= base install =============== +# install conda +COPY scripts/install-conda.sh /opt/scripts/install-conda.sh +RUN echo "${SHELL}"; env; cat ~/.bashrc; cat ~/.profile ; /opt/scripts/install-conda.sh + +# ========== jupyterlab install ============ +COPY jupyterlab/apt.txt /opt/jupyterlab/apt.txt +COPY scripts/install-apt.sh /opt/scripts/install-apt.sh +RUN /opt/scripts/install-apt.sh /opt/jupyterlab/apt.txt + +ARG SKIP_CONDA_SOLVE=no +COPY scripts/install-conda-environment.sh /opt/scripts/install-conda-environment.sh +COPY jupyterlab/environment.yaml /opt/jupyterlab/environment.yaml +COPY jupyterlab/conda-linux-64.lock /opt/jupyterlab/conda-linux-64.lock +RUN \ + if [ "${SKIP_CONDA_SOLVE}" != "no" ];then \ + ENV_FILE=/opt/jupyterlab/conda-linux-64.lock ; \ + else \ + ENV_FILE=/opt/jupyterlab/environment.yaml ; \ + fi ; \ + /opt/scripts/install-conda-environment.sh "${ENV_FILE}" 'true' + +COPY jupyterlab /opt/jupyterlab +RUN /opt/jupyterlab/postBuild + +# ========== Setup GPU Paths ============ +ENV LD_LIBRARY_PATH=/usr/local/nvidia/lib64 +ENV NVIDIA_PATH=/usr/local/nvidia/bin +ENV PATH="$NVIDIA_PATH:$PATH" diff --git a/README.md b/README.md index e152e60..a0b92cb 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,24 @@ # docker-images 🌅 Docker images for the Nebari platform + + +## Pinning + +It is extremely important to pin specific packages: + +- dask +- dask-gateway + +## Building Dockerfile + +```shell +docker build -f Dockerfile.jupyterlab -t qhub-jupyterlab:latest . +``` + +```shell +docker build -f Dockerfile.dask-gateway -t qhub-dask-gateway:latest . +``` + +```shell +docker build -f Dockerfile.dask-worker -t qhub-dask-worker:latest . +``` diff --git a/dask-worker/environment.yaml b/dask-worker/environment.yaml new file mode 100644 index 0000000..9712036 --- /dev/null +++ b/dask-worker/environment.yaml @@ -0,0 +1,6 @@ +name: base +channels: + - conda-forge +dependencies: + # dask + - qhub-dask==0.3.13 diff --git a/dask-worker/postBuild b/dask-worker/postBuild new file mode 100755 index 0000000..0530f43 --- /dev/null +++ b/dask-worker/postBuild @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -euo pipefail + +# A workaround that allows a command to run in a +# specific conda environment +cat < /opt/conda-run-worker +#!/bin/bash +set -xe + +source activate \$CONDA_ENVIRONMENT +dask-worker "\$@" +EOF + +cat < /opt/conda-run-scheduler +#!/bin/bash +set -xe + +source activate \$CONDA_ENVIRONMENT +dask-scheduler "\$@" +EOF + +chmod 755 /opt/conda-run-worker +chmod 755 /opt/conda-run-scheduler diff --git a/docker-bake.json b/docker-bake.json new file mode 100644 index 0000000..8590dcd --- /dev/null +++ b/docker-bake.json @@ -0,0 +1,45 @@ +{ + "variable": { + "TAG": { + "default": "latest" + } + }, + "group": { + "default": { + "targets": [ + "dask-worker", + "jupyterhub", + "jupyterlab" + ] + } + }, + "target": { + "dask-worker": { + "context": "./", + "dockerfile": "Dockerfile.dask-worker", + "tags": [ + "docker.io/quansight/qhub-dask-worker:${TAG}", + "ghcr.io/quansight/qhub-dask-worker:${TAG}", + "quay.io/quansight/qhub-dask-worker:${TAG}" + ] + }, + "jupyterhub": { + "context": "./", + "dockerfile": "Dockerfile.jupyterhub", + "tags": [ + "docker.io/quansight/qhub-jupyterhub:${TAG}", + "ghcr.io/quansight/qhub-jupyterhub:${TAG}", + "quay.io/quansight/qhub-jupyterhub:${TAG}" + ] + }, + "jupyterlab": { + "context": "./", + "dockerfile": "Dockerfile.jupyterlab", + "tags": [ + "docker.io/quansight/qhub-jupyterlab:${TAG}", + "ghcr.io/quansight/qhub-jupyterlab:${TAG}", + "quay.io/quansight/qhub-jupyterlab:${TAG}" + ] + } + } +} diff --git a/jupyterhub/environment.yaml b/jupyterhub/environment.yaml new file mode 100644 index 0000000..9c9a1b2 --- /dev/null +++ b/jupyterhub/environment.yaml @@ -0,0 +1,14 @@ +name: base +channels: + - conda-forge +dependencies: + - pip==21.1.2 + - jupyterhub==1.5.0 + - jupyterhub-kubespawner==1.1.0 + - oauthenticator==14.1.0 + - escapism==1.0.1 + - cdsdashboards==0.6.1 + - jupyterhub-idle-culler==1.0 + - pip: + - qhub-jupyterhub-theme==0.3.5 + - python-keycloak==0.26.1 diff --git a/jupyterhub/postBuild b/jupyterhub/postBuild new file mode 100755 index 0000000..6e87746 --- /dev/null +++ b/jupyterhub/postBuild @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +set -euo pipefail diff --git a/jupyterlab/apt.txt b/jupyterlab/apt.txt new file mode 100644 index 0000000..abe8dda --- /dev/null +++ b/jupyterlab/apt.txt @@ -0,0 +1,29 @@ +locales + +# assign uid/gid names +libnss-wrapper + +# utilities +wget +curl + +# development utilities +git +openssh-client + +# editors +nano +vim +emacs + +# conda prerequisites for GUI packages +# See https://docs.anaconda.com/anaconda/install/linux/ +libgl1-mesa-glx +libegl1-mesa +libxrandr2 +libxss1 +libxcursor1 +libxcomposite1 +libasound2 +libxi6 +libxtst6 diff --git a/jupyterlab/conda-linux-64.lock b/jupyterlab/conda-linux-64.lock new file mode 100644 index 0000000..db11d67 --- /dev/null +++ b/jupyterlab/conda-linux-64.lock @@ -0,0 +1,286 @@ +# platform: linux-64 +# env_hash: ec13d8a2dca324270bd1eb2cfa732ba394b3d635e68522c5baf75a72ddcb2074 +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2021.5.30-ha878542_0.tar.bz2#6a777890e94194dc94a29a76d2a7e721 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb +https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-hab24e00_0.tar.bz2#19410c3df09dfb12d1206132a1d357c5 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.35.1-hea4e1c9_2.tar.bz2#83610dba766a186bdc7a116053b782a4 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-9.3.0-hff62375_19.tar.bz2#c2d8da3cb171e4aa642d20c6e4e42a04 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-9.3.0-h6de172a_19.tar.bz2#cd9a24a8dde03ec0cf0e603b0bea85a1 +https://conda.anaconda.org/conda-forge/linux-64/pandoc-2.14.0.3-h7f98852_0.tar.bz2#de2c82d77816df3d6a5c7577826d86fb +https://conda.anaconda.org/conda-forge/noarch/tzdata-2021a-he74cb21_0.tar.bz2#6f36861f102249fc54861ff9343c3fdd +https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-9.3.0-hff62375_19.tar.bz2#aea379bd68fdcdf9499fa1453f852ac1 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-9.3.0-h2828fa1_19.tar.bz2#ab0a307912033126da02507b59e79ec9 +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-1_gnu.tar.bz2#561e277319a41d4f24f5c05a9ef63c04 +https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-9.3.0-h2828fa1_19.tar.bz2#9d5cdfc51476ee4dcdd96ed2dca3f943 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.17.1-h7f98852_1.tar.bz2#ed1dc233ed5e3eaa9bfbaac64d130c5e +https://conda.anaconda.org/conda-forge/linux-64/expat-2.4.1-h9c3ff4c_0.tar.bz2#16054ef3cb3ec5d8d29d08772662f65d +https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 +https://conda.anaconda.org/conda-forge/linux-64/geos-3.9.1-h9c3ff4c_2.tar.bz2#b9a6d9422aed3ad84ec6ccee9bfcaa0f +https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.1-h36c2ea0_2.tar.bz2#626e68ae9cc5912d6adb79d318cf962d +https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h58526e2_1001.tar.bz2#8c54672728e8ec6aa6db90cf2806d220 +https://conda.anaconda.org/conda-forge/linux-64/icu-68.1-h58526e2_0.tar.bz2#fc7a4271dc2a7f4fd78cd63695baf7c3 +https://conda.anaconda.org/conda-forge/linux-64/jbig-2.1-h7f98852_2003.tar.bz2#1aa0cee79792fa97b7ff4545110b60bf +https://conda.anaconda.org/conda-forge/linux-64/jpeg-9d-h36c2ea0_0.tar.bz2#ea02ce6037dbe81803ae6123e5ba1568 +https://conda.anaconda.org/conda-forge/linux-64/lerc-2.2.1-h9c3ff4c_0.tar.bz2#ea833dcaeb9e7ac4fac521f1a7abec82 +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.7-h7f98852_5.tar.bz2#10e242842cd30c59c12d79371dc0f583 +https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.3-h58526e2_2.tar.bz2#665369991d8dd290ac5ee92fce3e6bf5 +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.16-h516909a_0.tar.bz2#5c0f338a513a2943c659ae619fca9211 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.15-pthreads_h8fe5266_1.tar.bz2#bb5527a16584426a897f22643d9a36a6 +https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2#c3788462a6fbddafdb413a9f9053e58d +https://conda.anaconda.org/conda-forge/linux-64/libtool-2.4.6-h58526e2_1007.tar.bz2#7f6569a0c2f27acb8fc90600b382e544 +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.32.1-h7f98852_1000.tar.bz2#772d69f030955d9646d3d0eaf21d859d +https://conda.anaconda.org/conda-forge/linux-64/libuv-1.41.0-h7f98852_0.tar.bz2#808b41ebae1d9bd4aa8ffbc365d468c6 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.2.0-h7f98852_2.tar.bz2#fb63a035a3b552c88a30d84b89ebf4c4 +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.3-h9c3ff4c_0.tar.bz2#4eb64ee0d5cd43096ffcf843c76b05d4 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.2-h58526e2_4.tar.bz2#509f2a21c4a09214cd737a480dfd80c9 +https://conda.anaconda.org/conda-forge/linux-64/openssl-1.1.1k-h7f98852_0.tar.bz2#07fae2cb088379c8441e0f3ffa1f4025 +https://conda.anaconda.org/conda-forge/linux-64/pcre-8.45-h9c3ff4c_0.tar.bz2#c05d1820a6d34ff07aaaab7a9b7eddaa +https://conda.anaconda.org/conda-forge/linux-64/pixman-0.40.0-h36c2ea0_0.tar.bz2#660e72c82f2e75a6b3fe6a6e75c79f19 +https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 +https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a +https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.0.10-h7f98852_0.tar.bz2#d6b0b50b49eccfe0be0373be628be0f3 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.9-h7f98852_0.tar.bz2#bf6f803a544f26ebbdc3bfff272eb179 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 +https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2#06feff3d2634e3097ce2fe681474b534 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h7f98852_1002.tar.bz2#1e15f6ad85a7d743a2ac68dae6c82b98 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 +https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.5-h516909a_1.tar.bz2#33f601066901f3e1a85af3522a8113f9 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h516909a_0.tar.bz2#03a530e925414902547cf48da7756db8 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.11-h516909a_1010.tar.bz2#339cc5584e6d26bc73a875ba900028c3 +https://conda.anaconda.org/conda-forge/linux-64/gettext-0.19.8.1-h0b5b191_1005.tar.bz2#ff6f69b593a9e74c0e6b61908ac513fa +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-9_openblas.tar.bz2#5f08755e98b2a43ca68124e629a5a0cb +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.43.0-h812cca2_0.tar.bz2#1867d1e9658596b3fac8847a7702eef4 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.37-h21135ba_2.tar.bz2#b6acf807307d033d4b7e758b4f44b036 +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.9.0-ha56f1ee_6.tar.bz2#f0dfb86444df325e599dbc3f4c0a3f5b +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.13-h7f98852_1003.tar.bz2#a9371e9e40aded194dcba1447606c9a1 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.9.12-h72842e0_0.tar.bz2#bd14fdf5b9ee5568056a40a6a2f41866 +https://conda.anaconda.org/conda-forge/linux-64/nodejs-15.14.0-h92b4a50_0.tar.bz2#7776523c882ac0439ab12a7496f14c04 +https://conda.anaconda.org/conda-forge/linux-64/readline-8.1-h46c0cb4_0.tar.bz2#5788de3c8d7a7d64ac56c784c4ef48e6 +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.10-h21135ba_1.tar.bz2#c647f70aa7e3d4cc4e029cc1c9a99953 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.3-hd9c2040_1000.tar.bz2#9e856f78d5c80d5a78f61e72d1d473a3 +https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.4-h9c3ff4c_0.tar.bz2#9105c7da67ebfb39ff08e2a8ea72bb71 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.0-ha95c52a_0.tar.bz2#b56f94865e2de36abf054e7bfa499034 +https://conda.anaconda.org/conda-forge/linux-64/configurable-http-proxy-4.4.0-node15_he6ea98c_0.tar.bz2#0584f53ccb4b9832d5cd0e6ee194d8c0 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.10.4-h0708190_1.tar.bz2#4a06f2ac2e5bfae7b6b245171c3f07aa +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.19.1-hcc1bbae_0.tar.bz2#59b0695a515a6c54d45463dbf208ae38 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-9_openblas.tar.bz2#edee85b4f83376ceae81e0975b8bffa2 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.68.3-h3e27bee_0.tar.bz2#99416a3287216de097d503b827ad0bde +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-9_openblas.tar.bz2#572d84ab07962986f6dd8e4637a475ca +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.3.0-hf544144_1.tar.bz2#a65a4158716bd7d95bfa69bcfd83081c +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.36.0-h9cd32fc_0.tar.bz2#d5bbac924cbda57469f43448d5236a50 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.7.2-h7f98852_0.tar.bz2#12a61e640b8894504326aadafccbb790 +https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.36.0-h3371d22_4.tar.bz2#661e1ed5d92552785d9f8c781ce68685 +https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.13.1-hba837de_1005.tar.bz2#fd3611672eb91bc9d24fd6fb970037eb +https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.6-h04a7f16_0.tar.bz2#b24a1e18325a6e8f8b6b4a2ec5860ce2 +https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h64030ff_2.tar.bz2#112eb9b5b93f0c02e59aea4fd1967363 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.12-hddcbb42_0.tar.bz2#797117394a4aa588de6d741b06fad80f +https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.77.0-h2574ce0_0.tar.bz2#05cf8dca8408b5f1ffcc5e2d5a7c5da2 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.2.0-h3452ae3_0.tar.bz2#8f4e19a8988c38feec7db41bcd0bf0d0 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.4.0-hb52868f_1.tar.bz2#b7ad78ad2e9ee155f59e6428406ee824 +https://conda.anaconda.org/conda-forge/linux-64/python-3.9.5-h49503c6_0_cpython.tar.bz2#2139a8f9a7f5d1cbec3dc657be58a2ad +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h7f98852_1.tar.bz2#536cc5db4d0a3ba0630541aec064b5e4 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.10-h7f98852_1003.tar.bz2#f59c1242cc1dd93e72c2ee2b360979eb +https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.12-py_0.tar.bz2#2489a97287f90176ecdc3ca982b4b0a0 +https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2#5f095bc6454094e96f146491fd03633b +https://conda.anaconda.org/conda-forge/noarch/async-timeout-3.0.1-py_1000.tar.bz2#8b11024b2762a07aaa07d2743231a41b +https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-py_0.tar.bz2#d56c596e61b1c4952acf0a9920856c12 +https://conda.anaconda.org/conda-forge/noarch/attrs-21.2.0-pyhd8ed1ab_0.tar.bz2#d2e1c7f388ac403df7079b411c37cc50 +https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 +https://conda.anaconda.org/conda-forge/noarch/backports-1.0-py_2.tar.bz2#0da16b293affa6ac31812376f8eb79dd +https://conda.anaconda.org/conda-forge/noarch/blinker-1.4-py_1.tar.bz2#fa509a09190583f869ae442bf4d17f5f +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.16.0-h6cf1ce9_1008.tar.bz2#a43fb47d15e116f8be4be7e6b17ab59f +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-1.6.0-py_0.tar.bz2#76d764d8881719e305f6fa368dc2b65e +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.4-pyh9f0ad1d_0.tar.bz2#c08b4c1326b880ed44f3ffb04803332f +https://conda.anaconda.org/conda-forge/noarch/dataclasses-0.8-pyhc8e2a94_1.tar.bz2#28e0de0ecba81334619a777fdc00febc +https://conda.anaconda.org/conda-forge/noarch/decorator-5.0.9-pyhd8ed1ab_0.tar.bz2#0ae9cca42e37b5ce6267c2a2b1383546 +https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 +https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.3-pyhd8ed1ab_1003.tar.bz2#bbf9a201f6ce99a506f4955374d9a9f4 +https://conda.anaconda.org/conda-forge/noarch/escapism-1.0.1-pyh9f0ad1d_0.tar.bz2#598755324d753727149360b89bcf14b3 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2021.6.1-pyhd8ed1ab_0.tar.bz2#b8dca3cd859c8a849042af6db1cbedca +https://conda.anaconda.org/conda-forge/noarch/heapdict-1.0.1-py_0.tar.bz2#77242bfb1e74a627fb06319b5a2d3b95 +https://conda.anaconda.org/conda-forge/noarch/idna-2.10-pyh9f0ad1d_0.tar.bz2#f95a12b4f435aae6680fe55ae2eb1b06 +https://conda.anaconda.org/conda-forge/noarch/imagesize-1.2.0-py_0.tar.bz2#5879bd2c4b399a5072468e5fe587bf1b +https://conda.anaconda.org/conda-forge/noarch/iniconfig-1.1.1-pyh9f0ad1d_0.tar.bz2#39161f81cc5e5ca45b8226fbb06c6905 +https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-py_1.tar.bz2#5071c982548b3a20caf70462f04f5287 +https://conda.anaconda.org/conda-forge/noarch/json5-0.9.5-pyh9f0ad1d_0.tar.bz2#10759827a94e6b14996e81fb002c0bda +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-1.0.0-pyhd8ed1ab_1.tar.bz2#f8da92114c8fbe1d951b0efaf54dd14b +https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.2-h78a0170_0.tar.bz2#ac0c23e6f3bbb61569781f00b5666f97 +https://conda.anaconda.org/conda-forge/noarch/locket-0.2.0-py_2.tar.bz2#709e8671651c7ec3d1ad07800339ff1d +https://conda.anaconda.org/conda-forge/noarch/mccabe-0.6.1-py_1.tar.bz2#a326cb400c1ccd91789f3e7d02124d61 +https://conda.anaconda.org/conda-forge/noarch/more-itertools-8.8.0-pyhd8ed1ab_0.tar.bz2#af8d3837f18d331839368bcb9f8cd3d9 +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.5.1-pyhd8ed1ab_0.tar.bz2#47a51a5b8f9cc41004c8d7bd88b62447 +https://conda.anaconda.org/conda-forge/noarch/olefile-0.46-pyh9f0ad1d_1.tar.bz2#0b2e68acc8c78c8cc392b90983481f58 +https://conda.anaconda.org/conda-forge/noarch/pamela-1.0.0-py_0.tar.bz2#36f6f18d2f3ae0c93d77a9dbedad08c3 +https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.4.2-py_1.tar.bz2#ba6f4a308f1ea22abe1d72e72544af76 +https://conda.anaconda.org/conda-forge/noarch/param-1.10.1-pyhd3deb0d_0.tar.bz2#e990456731e2381b8801b26242234e26 +https://conda.anaconda.org/conda-forge/noarch/parso-0.8.2-pyhd8ed1ab_0.tar.bz2#fb40b157bd62b457a1cc82527b63f0b0 +https://conda.anaconda.org/conda-forge/noarch/pathspec-0.8.1-pyhd3deb0d_0.tar.bz2#fcd2fbb062b55d14a77e664c89ee17a6 +https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2#415f0ebb6198cc2801c73438a9fb5761 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.11.0-pyhd8ed1ab_0.tar.bz2#01f530bf82d9f589c2087b8c347d5e29 +https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2#359eeb6536da0e687af562ed265ec263 +https://conda.anaconda.org/conda-forge/noarch/py-1.10.0-pyhd3deb0d_0.tar.bz2#88ca1328ecc79a070214aa24911bace8 +https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.7.0-pyhd8ed1ab_0.tar.bz2#0234673eb2ecfbdf4e54574ab4d95f81 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.20-pyh9f0ad1d_2.tar.bz2#aa798d50ffd182a0f6f31478c7f434f6 +https://conda.anaconda.org/conda-forge/noarch/pyflakes-2.3.1-pyhd8ed1ab_0.tar.bz2#01e9ada82bd261ee2b6366aa832018cc +https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.1.0-pyhd8ed1ab_0.tar.bz2#c602e093a43beb74210362e983584666 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-2.4.7-pyh9f0ad1d_0.tar.bz2#626c4f20d5bf06dcec9cf2eaa31725c7 +https://conda.anaconda.org/conda-forge/noarch/python-editor-1.0.4-py_0.tar.bz2#eaaf29a0644f9407f98a4665f45880c4 +https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.1-pyh9f0ad1d_0.tar.bz2#aed452f2f9f8bc8b2b0c412975051b5b +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-2_cp39.tar.bz2#39adde4247484de2bb4000122fdcf665 +https://conda.anaconda.org/conda-forge/noarch/pytz-2021.1-pyhd8ed1ab_0.tar.bz2#3af2e9424d5eb0063824a3f9b850d411 +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.7.1-pyhd8ed1ab_0.tar.bz2#10c92e8e5c7ca439d11bec031ff17db3 +https://conda.anaconda.org/conda-forge/noarch/simpervisor-0.4-pyhd8ed1ab_0.tar.bz2#12b5f0d11cc26bf386bd9a2f99099648 +https://conda.anaconda.org/conda-forge/noarch/six-1.15.0-pyh9f0ad1d_0.tar.bz2#1eec421f0f1f39e579e44e4a5ce646a2 +https://conda.anaconda.org/conda-forge/noarch/smmap-3.0.5-pyh44b312d_0.tar.bz2#3a8dc70789709aa315325d5df06fb7e4 +https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.1.0-pyhd8ed1ab_0.tar.bz2#f1d64c0cf0eedf655a96ccdc1573c05a +https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2#6d6552722448103793743dabfbda532d +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.2-py_0.tar.bz2#20b2eaeaeea4ef9a9a0d99770620fd09 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.2-py_0.tar.bz2#68e01cac9d38d0e717cd5c87bc3d2cc9 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.0-pyhd8ed1ab_0.tar.bz2#77dad82eb9c8c1525ff7953e0756d708 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-py_0.tar.bz2#67cd9d9c0382d37479b4d306c369a2d4 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.3-py_0.tar.bz2#d01180388e6d1838c3e1ad029590aa7a +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.5-pyhd8ed1ab_0.tar.bz2#60e630285f44af05767dcb7f473ee03f +https://conda.anaconda.org/conda-forge/noarch/tblib-1.7.0-pyhd8ed1ab_0.tar.bz2#3d4afc31302aa7be471feb6be048ed76 +https://conda.anaconda.org/conda-forge/noarch/testpath-0.5.0-pyhd8ed1ab_0.tar.bz2#53b57d6a468bebc7cef1253b177a5e9e +https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 +https://conda.anaconda.org/conda-forge/noarch/toolz-0.11.1-py_0.tar.bz2#d1e66b58cb00b3817ad9f05eec098c00 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-3.10.0.0-pyha770c72_0.tar.bz2#67c0cba6533b641f28946d7c16f361c8 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.36.2-pyhd3deb0d_0.tar.bz2#768bfbe026426d0e76b377997d1f2b98 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.4.1-pyhd8ed1ab_0.tar.bz2#a4fa30eb74a326092b3d8078b1f1aae1 +https://conda.anaconda.org/conda-forge/noarch/babel-2.9.1-pyh44b312d_0.tar.bz2#74136ed39bfea0832d338df1e58d013e +https://conda.anaconda.org/conda-forge/linux-64/certifi-2021.5.30-py39hf3d152e_0.tar.bz2#7bbfaa3b8363bf8505d7f65e4e2e8a90 +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.14.5-py39he32792d_0.tar.bz2#b561e1fad1fc8bb343064bd5497444bb +https://conda.anaconda.org/conda-forge/linux-64/chardet-4.0.0-py39hf3d152e_1.tar.bz2#d0da429a3428ffcacaad25595b96a648 +https://conda.anaconda.org/conda-forge/linux-64/click-8.0.1-py39hf3d152e_0.tar.bz2#ab32c487b1b91d783fb68388c49bb254 +https://conda.anaconda.org/conda-forge/linux-64/coverage-5.5-py39h3811e60_0.tar.bz2#bcdadca13080d0210f405d82e66452a3 +https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.11.0-py39h3811e60_3.tar.bz2#b2acd01289447c022fde78c3b91e6e39 +https://conda.anaconda.org/conda-forge/linux-64/docutils-0.17.1-py39hf3d152e_0.tar.bz2#9a81e8d9b36bd78688aebeac5e1f0ac1 +https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.7-pyhd8ed1ab_0.tar.bz2#12977b4cc317a6ee2939aedcb09a4898 +https://conda.anaconda.org/conda-forge/linux-64/greenlet-1.1.0-py39he80948d_0.tar.bz2#c1880c3fed75715fb9e7d7be70708cba +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-2.8.1-h83ec7ef_0.tar.bz2#654935b08e8bd4a8cbf6a4253e290c04 +https://conda.anaconda.org/conda-forge/linux-64/importlib-metadata-4.5.0-py39hf3d152e_0.tar.bz2#66abc2b295f6dd4d05c21b11a9f53e35 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.1.4-pyhd8ed1ab_0.tar.bz2#6623391428e75e1ded2fc117b86a747e +https://conda.anaconda.org/conda-forge/linux-64/jedi-0.18.0-py39hf3d152e_2.tar.bz2#cb9b5c105fb10e59bf5a263880735235 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.0.1-py39h3811e60_0.tar.bz2#9233d63cfb05aa6536ab9e253bee9507 +https://conda.anaconda.org/conda-forge/linux-64/mistune-0.8.4-py39h3811e60_1003.tar.bz2#716b1f4d19fdedf318dd100682399a76 +https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.2-py39h1a9c180_1.tar.bz2#de3a1627c3c8293668468985c6118b6d +https://conda.anaconda.org/conda-forge/linux-64/multidict-5.1.0-py39h3811e60_1.tar.bz2#8a109e2749c19efbba72c3a6dccc5063 +https://conda.anaconda.org/conda-forge/linux-64/mypy_extensions-0.4.3-py39hf3d152e_3.tar.bz2#fcab473c122479c0a4b1a14f716b7f1d +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.21.0-py39hdbf815f_0.tar.bz2#cae5dc3cb8cee346454a05670966f314 +https://conda.anaconda.org/conda-forge/noarch/packaging-20.9-pyh44b312d_0.tar.bz2#be69a38e912054a62dc82cc3c7711a64 +https://conda.anaconda.org/conda-forge/noarch/partd-1.2.0-pyhd8ed1ab_0.tar.bz2#0c32f563d7f22e3a34c95cad8cc95651 +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh9f0ad1d_2.tar.bz2#5909e7b978141dd80d28dbf9de627827 +https://conda.anaconda.org/conda-forge/linux-64/pillow-8.2.0-py39hf95b381_1.tar.bz2#85d36b82d030cf244358187a11a52e99 +https://conda.anaconda.org/conda-forge/linux-64/pluggy-0.13.1-py39hf3d152e_4.tar.bz2#4d5bb60996f07fe6781efc7b476a7e2c +https://conda.anaconda.org/conda-forge/linux-64/psutil-5.8.0-py39h3811e60_1.tar.bz2#29cb4c7769cc2a6e86cc13615e9b4a15 +https://conda.anaconda.org/conda-forge/linux-64/pycurl-7.43.0.6-py39h72e3413_1.tar.bz2#69c4c5662956330121a957998669b800 +https://conda.anaconda.org/conda-forge/linux-64/pyrsistent-0.17.3-py39h3811e60_2.tar.bz2#4ec88cc4b941bc447fd97cadd76e32de +https://conda.anaconda.org/conda-forge/linux-64/pysocks-1.7.1-py39hf3d152e_3.tar.bz2#f7e7fdc66f2362bebc407f1ab7d10f63 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.1-py_0.tar.bz2#0d0150ed9c2d25817f5324108d3f7571 +https://conda.anaconda.org/conda-forge/noarch/pyviz_comms-2.0.2-pyhd8ed1ab_0.tar.bz2#3c780b24c0fcf858429f56cc293f5806 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-5.4.1-py39h3811e60_0.tar.bz2#6451ed66b3b438134626894c821dc5fa +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-22.1.0-py39h37b5a0c_0.tar.bz2#3db8711d970239699f6e7dff64ad09af +https://conda.anaconda.org/conda-forge/linux-64/regex-2021.4.4-py39h3811e60_0.tar.bz2#904912568b4f51d52e8a77604e8b2bd1 +https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.2-py39h3811e60_2.tar.bz2#d7770c88f04155fcff2942a1ff750ff1 +https://conda.anaconda.org/conda-forge/linux-64/sniffio-1.2.0-py39hf3d152e_1.tar.bz2#a620158b380f03f82e8ceac1397270b7 +https://conda.anaconda.org/conda-forge/noarch/tenacity-7.0.0-pyhd8ed1ab_0.tar.bz2#1e78781812622a6df0141e0857f52ab3 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.1-py39h3811e60_1.tar.bz2#763597c8b91b69789ab0f6002439c32b +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.0.5-py_0.tar.bz2#99618ee9ab1323e40f231acdab92fe60 +https://conda.anaconda.org/conda-forge/linux-64/typed-ast-1.4.3-py39h3811e60_0.tar.bz2#a25ce1f6fa278ccfaffb6dd35720b8be +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-3.10.0.0-hd8ed1ab_0.tar.bz2#b71b8a980a36234ebbbd6b43da5807d0 +https://conda.anaconda.org/conda-forge/linux-64/websocket-client-0.57.0-py39hf3d152e_4.tar.bz2#d4b25baf59c9c67c47dc48ceabd1b750 +https://conda.anaconda.org/conda-forge/noarch/zict-2.0.0-py_0.tar.bz2#4750152be22f24d695b3004c5e1712d3 +https://conda.anaconda.org/conda-forge/linux-64/anyio-3.2.1-py39hf3d152e_0.tar.bz2#e9c587013bd7dde40cd6c88e7705dd5f +https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-20.1.0-py39h3811e60_2.tar.bz2#9e69a6cedbffc71321daf4895b9db5bf +https://conda.anaconda.org/conda-forge/noarch/black-21.5b2-pyhd8ed1ab_0.tar.bz2#919be0b3435cbe8e803c6bd738231f69 +https://conda.anaconda.org/conda-forge/noarch/bokeh-root-cmd-0.0.5-py_0.tar.bz2#9886dce45c728d4bf9991bd0450482f5 +https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py39h3811e60_1001.tar.bz2#35ad78e61aec955783acfd00f3c6bcde +https://conda.anaconda.org/conda-forge/linux-64/cryptography-3.4.7-py39hbca0aa6_0.tar.bz2#04e97f7d5c60f75a36b1e4bdf3652ebd +https://conda.anaconda.org/conda-forge/noarch/dask-core-2021.6.2-pyhd8ed1ab_0.tar.bz2#a5a365e004f7cb59d652254800cc40b7 +https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.18-pyhd8ed1ab_0.tar.bz2#19520f600cddf466cc3551e521809b66 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.0.1-pyhd8ed1ab_0.tar.bz2#c647e77921fd3e245cdcc5b2d451a0f8 +https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-4.7.1-py39hf3d152e_0.tar.bz2#6bddb50072e5c769100295b967b7b212 +https://conda.anaconda.org/conda-forge/noarch/mako-1.1.4-pyh44b312d_0.tar.bz2#1b618b99d151e88ba0fabff9fa2b2d0b +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.2-pyhd8ed1ab_2.tar.bz2#0967e1db58b16e416464ca399f87df79 +https://conda.anaconda.org/conda-forge/linux-64/pango-1.48.5-hb8ff022_0.tar.bz2#f4e263c4dfa15b6a97349782793d1ee7 +https://conda.anaconda.org/conda-forge/noarch/plotlydash-tornado-cmd-0.0.6-pyhd8ed1ab_0.tar.bz2#8be485563a7386e9cab83d5c153899e8 +https://conda.anaconda.org/conda-forge/linux-64/pytest-6.2.4-py39hf3d152e_0.tar.bz2#9fd4e5f95830a66049d36b6ad2ce862b +https://conda.anaconda.org/conda-forge/noarch/rshiny-server-cmd-0.0.2-py_0.tar.bz2#90e385056bd49b2e87d86a299a67d1a1 +https://conda.anaconda.org/conda-forge/linux-64/setuptools-49.6.0-py39hf3d152e_3.tar.bz2#4397280abb201d7adff59099e12e7ddd +https://conda.anaconda.org/conda-forge/linux-64/shapely-1.7.1-py39ha61afbd_5.tar.bz2#3327aae8961242e70ebf6efc0d54df59 +https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-1.4.19-py39h3811e60_0.tar.bz2#35d573fd340940e18f06b997b180078d +https://conda.anaconda.org/conda-forge/linux-64/terminado-0.10.1-py39hf3d152e_0.tar.bz2#c1f50c1091ceb03d358d7c18f663b938 +https://conda.anaconda.org/conda-forge/noarch/traittypes-0.2.1-pyh9f0ad1d_2.tar.bz2#7d32ccb5334a6822c28af3e864550618 +https://conda.anaconda.org/conda-forge/linux-64/yarl-1.6.3-py39h3811e60_1.tar.bz2#d1ff2cc419476806c2c8866b268edcba +https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.7.4.post0-py39h3811e60_0.tar.bz2#9c014440a979c8805492f69002102e45 +https://conda.anaconda.org/conda-forge/noarch/alembic-1.6.5-pyhd8ed1ab_0.tar.bz2#b0d409235bcbf602253ec0225ddcf34c +https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.4-pyhd8ed1ab_0.tar.bz2#c5b3edc62d6309088f4970b3eaaa65a6 +https://conda.anaconda.org/conda-forge/noarch/bleach-3.3.0-pyh44b312d_0.tar.bz2#abf6b76c39358ca36ca706c46f054f2a +https://conda.anaconda.org/conda-forge/linux-64/bokeh-2.3.2-py39hf3d152e_0.tar.bz2#8ea8ea7773c0df5460048d4b3d874401 +https://conda.anaconda.org/conda-forge/noarch/branca-0.4.2-pyhd8ed1ab_0.tar.bz2#836c975d3ae4f21c3cd047c10b15a7cf +https://conda.anaconda.org/conda-forge/linux-64/distributed-2021.6.2-py39hf3d152e_0.tar.bz2#c88793a27380600118f38f6e21d23f94 +https://conda.anaconda.org/conda-forge/noarch/flake8-3.9.2-pyhd8ed1ab_0.tar.bz2#37d685abea0a25c921431edda02ad143 +https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h539f30e_1.tar.bz2#606777b4da3664d5c9415f5f165349fd +https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.14.0-pyhd8ed1ab_0.tar.bz2#5751a9fd18d65535bbf6ab3e1b106639 +https://conda.anaconda.org/conda-forge/noarch/importnb-0.7.0-pyhd8ed1ab_0.tar.bz2#73d3885a2fc883f4d19bc7b70baa37d2 +https://conda.anaconda.org/conda-forge/noarch/isort-5.9.1-pyhd8ed1ab_0.tar.bz2#3a32c80ce9da25cf4d113abc8b5b5ae1 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-3.2.0-pyhd8ed1ab_3.tar.bz2#66125e28711d8ffc04a207a2b170316d +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-6.1.12-pyhd8ed1ab_0.tar.bz2#f58b38ddb9f94fa3cafea4ba2b17f93b +https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.50.7-hc3c00ef_0.tar.bz2#63fb96444e336b3d937921223dd9a481 +https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.1.1-pyhd8ed1ab_0.tar.bz2#34bb0b023e083aa8a4af74311031a352 +https://conda.anaconda.org/conda-forge/noarch/pip-21.1.2-pyhd8ed1ab_0.tar.bz2#dbd830edaffe5fc9ae6c1d425db2b5f2 +https://conda.anaconda.org/conda-forge/noarch/plotly-5.0.0-pyhd8ed1ab_0.tar.bz2#54b9cd7a0768675f389aa9b4b10b5e7e +https://conda.anaconda.org/conda-forge/noarch/pygments-2.9.0-pyhd8ed1ab_0.tar.bz2#a2d9bba43c9b80a42b0ccb9afd7223c2 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-20.0.1-pyhd8ed1ab_0.tar.bz2#92371c25994d0f5d28a01c1fb75ebf86 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-2.12.1-pyhd8ed1ab_0.tar.bz2#806b9d494058d0ec2dfd76607d1c33f4 +https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.17.10-py39h3811e60_0.tar.bz2#add249f18d9609f13756a8df625ae549 +https://conda.anaconda.org/conda-forge/noarch/certipy-0.1.3-py_0.tar.bz2#23486713ef5712923e7c57cae609b22e +https://conda.anaconda.org/conda-forge/linux-64/graphviz-2.47.3-h85b4f2f_0.tar.bz2#099cc43ac1c5bcce50318a9fc14a1d49 +https://conda.anaconda.org/conda-forge/noarch/jupyter_telemetry-0.1.0-pyhd8ed1ab_1.tar.bz2#bb9ebdb6d5aa2622484aff1faceee181 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.1.2-pyh9f0ad1d_0.tar.bz2#2cbd910890bb328e8959246a1e16fac7 +https://conda.anaconda.org/conda-forge/linux-64/nb_conda_kernels-2.3.1-py39hf3d152e_0.tar.bz2#f6333d9a056f0a5ca1fee20b51d9c68d +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.1.3-pyhd8ed1ab_0.tar.bz2#bafa5df6d4f8db69a4d197b4657127e7 +https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.6-pyhd8ed1ab_0.tar.bz2#dea5b6d93cfbfbc2a253168ad05b3f89 +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.5-pyh9f0ad1d_2.tar.bz2#5266fcd697043c59621fda522b3d78ee +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.5.3-pyhd8ed1ab_0.tar.bz2#67f12831640fde52fe9be1bbc6b699e7 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.19-pyha770c72_0.tar.bz2#d6db5e598611b7e81a3d38498174e6e8 +https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.16-pyh243d235_2.tar.bz2#8a37b68eb6fd242a4112781c2f7b4b98 +https://conda.anaconda.org/conda-forge/noarch/requests-2.25.1-pyhd3deb0d_0.tar.bz2#ae687aba31a1c400192a86a2e993ffdc +https://conda.anaconda.org/conda-forge/linux-64/ipython-7.24.1-py39hef51801_0.tar.bz2#8686f4d34a090708595512cd687d8406 +https://conda.anaconda.org/conda-forge/linux-64/jupyterhub-base-1.4.1-py39hf3d152e_0.tar.bz2#b9e5536bac6400b7421a86d7115aefd3 +https://conda.anaconda.org/conda-forge/linux-64/nbconvert-6.1.0-py39hf3d152e_0.tar.bz2#219de8ad1b69d767ae18990b0a35ad50 +https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.19-hd8ed1ab_0.tar.bz2#22417c53873d61803b8eda5ba13fd85d +https://conda.anaconda.org/conda-forge/noarch/requests-unixsocket-0.2.0-py_0.tar.bz2#1e94a233d2f2c81b2bf11bd43a515fbe +https://conda.anaconda.org/conda-forge/noarch/sphinx-4.0.2-pyh6c4a22f_1.tar.bz2#108b16e11efe325bea984fbbe07a2aac +https://conda.anaconda.org/conda-forge/linux-64/ipykernel-5.5.5-py39hef51801_0.tar.bz2#cce0eaebab7125e8b51757a23005f5f1 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-1.9.0-pyhd8ed1ab_0.tar.bz2#dbd1bf29ba9a37b5c20a1ca4273fa1e3 +https://conda.anaconda.org/conda-forge/linux-64/jupyterhub-1.4.1-py39hf3d152e_0.tar.bz2#bf4966ba060a1704e701bdfccd4b4b70 +https://conda.anaconda.org/conda-forge/noarch/cdsdashboards-0.5.7-pyhd8ed1ab_0.tar.bz2#44afe22558a458f858b373d34da2281f +https://conda.anaconda.org/conda-forge/noarch/jhsingle-native-proxy-0.7.6-pyhd8ed1ab_0.tar.bz2#d790ef10dae54505b17b3bee560a3a89 +https://conda.anaconda.org/conda-forge/noarch/jupyter-server-mathjax-0.2.3-pyhd8ed1ab_0.tar.bz2#2d0951b616bb3a172032ade395706f45 +https://conda.anaconda.org/conda-forge/noarch/jupyter-server-proxy-3.0.2-pyhd8ed1ab_0.tar.bz2#1950c6645c9213a30545eee4d54cb495 +https://conda.anaconda.org/conda-forge/noarch/jupyter_console-6.4.0-pyhd8ed1ab_0.tar.bz2#ee5895aebb8104e4e087f06aae64977a +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.6.0-pyhd8ed1ab_0.tar.bz2#62e29ad8a1c72f2ec56dffef91870fe3 +https://conda.anaconda.org/conda-forge/noarch/nbval-0.9.6-pyh9f0ad1d_0.tar.bz2#b627e05284e7affc46b6e4878aa1d96b +https://conda.anaconda.org/conda-forge/noarch/notebook-6.4.0-pyha770c72_0.tar.bz2#1edbf3ee7482e201e572db0211e17f30 +https://conda.anaconda.org/conda-forge/noarch/cdsdashboards-singleuser-0.5.7-hd8ed1ab_0.tar.bz2#d9bf32a782eaa3a1f6a1339b792e51f1 +https://conda.anaconda.org/conda-forge/noarch/nbclassic-0.3.1-pyhd8ed1ab_1.tar.bz2#aa4f94da9fafb5b774493b26b631ad3f +https://conda.anaconda.org/conda-forge/noarch/nbdime-3.1.0-pyhd8ed1ab_0.tar.bz2#01a2197677952bf94a26f8995f8703fe +https://conda.anaconda.org/conda-forge/linux-64/widgetsnbextension-3.5.1-py39hf3d152e_4.tar.bz2#ae54c7d751b678c0021929892d598ecd +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-7.6.3-pyhd3deb0d_0.tar.bz2#536a9ed6d9e740f2b83d1a3c388e4388 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-3.0.16-pyhd8ed1ab_0.tar.bz2#48c10ee082d1649df09476e55bdc84e9 +https://conda.anaconda.org/conda-forge/noarch/dask-labextension-5.0.2-pyhd8ed1ab_0.tar.bz2#205854fc12634c9b0cb8f4356ed41525 +https://conda.anaconda.org/conda-forge/noarch/ipyleaflet-0.14.0-pyhd8ed1ab_1.tar.bz2#0c8cab53cd1674911fd19c1563232aa0 +https://conda.anaconda.org/conda-forge/noarch/jupyter-videochat-0.5.1-pyhd8ed1ab_0.tar.bz2#714c09e7292c416dcbe49e90b5c77cab +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-git-0.30.1-pyhd8ed1ab_0.tar.bz2#c1f1d4868b0bf646d49e89d5bc3351a5 +https://conda.anaconda.org/conda-forge/noarch/sidecar-0.5.1-pyhd8ed1ab_0.tar.bz2#894e0063c1407cf3125c5deaf403c980 +https://conda.anaconda.org/conda-forge/noarch/dask_labextension-5.0.2-hd8ed1ab_0.tar.bz2#78af422ae1762f891b3e4099e6ed16b2 diff --git a/jupyterlab/environment.yaml b/jupyterlab/environment.yaml new file mode 100644 index 0000000..b5ec1b7 --- /dev/null +++ b/jupyterlab/environment.yaml @@ -0,0 +1,56 @@ +name: default +channels: + - conda-forge +dependencies: + # general + - pip + + # jupyterhub/jupyterlab + - nb_conda_kernels + - ipython > 7 + - jupyter-server-proxy + - "jupyter_server>=1.15.6 | <1.15" + - jupyterlab >=3 + - jupyter_client + - jupyter_console + - jupyterhub==1.5.0 + - nbconvert + - nbval + - retrolab + + # jupyterlab extensions + - dask_labextension >=5.0.0 + - jupyterlab-git >=0.30.0 + - sidecar >=0.5.0 + - jupyter-videochat >=0.5.0 + - ipywidgets >=7.6 + - ipyleaflet >=0.13.5 + - pyviz_comms >=2.0.1 + - jupyter-resource-usage >=0.6.0 + - nbgitpuller + + # cds dashboards + - cdsdashboards-singleuser >=0.6.1 + - jhsingle-native-proxy >=0.7.6 + + # viz tools + - param + - python-graphviz + - plotly >=5.0 + + # testing, docs, linting + - pytest + - hypothesis + - flake8 + - sphinx + - pytest-cov + - black + - isort + - importnb + + # vscode + - code-server >= 3.2 + + - pip: + # vscode jupyterlab launcher + - git+https://github.com/betatim/vscode-binder diff --git a/jupyterlab/postBuild b/jupyterlab/postBuild new file mode 100755 index 0000000..34f7ad1 --- /dev/null +++ b/jupyterlab/postBuild @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +set -euo pipefail +set -x + +# install classic notebook extensions +jupyter nbextension enable --py widgetsnbextension --sys-prefix + +# if DEFAULT_ENV is unset ${DEFAULT_ENV+x} expands to nothing otherwise +# it substitutes the string x. This allows us to check if the variable +# is set without triggering an unbound variable error +if [[ -z "${DEFAULT_ENV+x}" ]]; then + fix-permissions /opt/conda/bin +else + fix-permissions "/opt/conda/envs/${DEFAULT_ENV}" +fi diff --git a/scripts/fix-permissions b/scripts/fix-permissions new file mode 100755 index 0000000..3cc9c88 --- /dev/null +++ b/scripts/fix-permissions @@ -0,0 +1,12 @@ +#!/bin/bash +# uses find to avoid touching files that already have the right permissions +# right permissions are: +# world rX, we have no guarantees of uids or gids upon +# deployment so we want files accessible to all. + +set -e +for d in "$@"; do + find "$d" \ + ! -perm -o+rX \ + -exec chmod o+rX {} \; +done diff --git a/scripts/install-apt-minimal.sh b/scripts/install-apt-minimal.sh new file mode 100755 index 0000000..ca7c5b3 --- /dev/null +++ b/scripts/install-apt-minimal.sh @@ -0,0 +1,4 @@ +apt-get update --fix-missing && \ + apt-get install -y wget bzip2 ca-certificates curl git && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* /var/tmp/* /tmp/* diff --git a/scripts/install-apt.sh b/scripts/install-apt.sh new file mode 100755 index 0000000..5dee5a0 --- /dev/null +++ b/scripts/install-apt.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +set -xe + +# Assumes apt packages installs packages in "$1" argument + +# ====== install apt packages ======== +apt-get update +apt-get install -y --no-install-recommends $(grep -vE "^\s*#" $1 | tr "\n" " ") + +# ========== cleanup apt ============= +apt-get clean +rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* diff --git a/scripts/install-conda-environment.sh b/scripts/install-conda-environment.sh new file mode 100755 index 0000000..19e7cfd --- /dev/null +++ b/scripts/install-conda-environment.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +set -xe +ENV_FILE="${1}"; shift # path to environment yaml or lock file +NEW_ENV="${1}"; shift # true or false indicating whether env update should occur + +# Capture last optional arg or set a ENV_NAME. This can be changed but be +# careful... setting the path for both the dockerfile and runtime container +# can be tricky +if [[ -z "${1+x}" ]] || [[ "${1}" == "" ]]; then + ENV_NAME=default +else + ENV_NAME="${1}"; shift +fi + +# Set a default value for skipping the conda solve (using a lock file). +: ${SKIP_CONDA_SOLVE:=no} + +# ==== install conda dependencies ==== + +if ! ${NEW_ENV};then + if [[ $(basename "${ENV_FILE}") =~ "*lock*" ]];then + echo "${ENV_FILE} should not be a lock file as this is not supported when \ + only updating the conda environment. Consider setting NEW_ENV to yes." + exit 1 + fi + echo Installing into current conda environment + mamba env update -f "${ENV_FILE}" + +# Env not being updated... create one now: +elif [[ "${SKIP_CONDA_SOLVE}" == "no" ]];then + mamba env create --prefix=/opt/conda/envs/${ENV_NAME} -f "${ENV_FILE}" +elif [[ "${SKIP_CONDA_SOLVE}" == "yes" ]];then + mamba create --prefix=/opt/conda/envs/${ENV_NAME} --file "${ENV_FILE}" + + # This needs to be set using the ENV directive in the docker file + PATH="/opt/conda/envs/${ENV_NAME}/bin:${PATH}" + # For now install pip section manually. We could consider using pip-tools... + # See https://github.com/conda-incubator/conda-lock/issues/4 + pip install https://github.com/dirkcgrunwald/jupyter_codeserver_proxy-/archive/5596bc9c2fbd566180545fa242c659663755a427.tar.gz +else + echo "SKIP_CONDA_SOLVE should be yes or no instead got: '${SKIP_CONDA_SOLVE}'" + exit 1 +fi + +# ========= list dependencies ======== +/opt/conda/bin/conda list + +# ========== cleanup conda =========== +/opt/conda/bin/mamba clean -afy +# remove unnecissary files (statis, js.maps) +find /opt/conda/ -follow -type f -name '*.a' -delete +find /opt/conda/ -follow -type f -name '*.js.map' -delete + +# Fix permissions +fix-permissions "/opt/conda/envs/${ENV_NAME}" || fix-permissions /opt/conda/bin diff --git a/scripts/install-conda.sh b/scripts/install-conda.sh new file mode 100755 index 0000000..3f167b2 --- /dev/null +++ b/scripts/install-conda.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +set -xe +# Requires environment CONDA_SHA256, CONDA_VERSION, and DEFAULT_ENV +wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-$CONDA_VERSION-Linux-x86_64.sh + +echo "${CONDA_SHA256} Miniconda3-$CONDA_VERSION-Linux-x86_64.sh" > miniconda.checksum + +if [ $(sha256sum -c miniconda.checksum | awk '{print $2}') != "OK" ]; then + echo Error when testing checksum + exit 1; +fi + +mv Miniconda3-$CONDA_VERSION-Linux-x86_64.sh miniconda.sh +sh ./miniconda.sh -b -p /opt/conda +rm miniconda.sh miniconda.checksum + +# install mamba and clean up +conda install -y -c conda-forge mamba +mamba clean -afy +find /opt/conda/ -follow -type f -name '*.a' -delete +find /opt/conda/ -follow -type f -name '*.js.map' -delete + +ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh + +mkdir -p /etc/conda +cat < /etc/conda/condarc +always_yes: true +changeps1: false +auto_update_conda: false +aggressive_update_packages: [] +envs_dirs: + - /home/conda/environments +EOF + +# Fix permissions in accordance with jupyter stack permissions +# model +fix-permissions /opt/conda /etc/conda /etc/profile.d From cf85f29c18cac75cc04d5d539df417e4b2cbcdf9 Mon Sep 17 00:00:00 2001 From: iameskild Date: Mon, 30 May 2022 16:28:19 -0700 Subject: [PATCH 02/27] Edit workflow --- .github/workflows/image.yaml | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index d759cf1..ea4f579 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -1,3 +1,6 @@ +# Build and push images to : +# GitHub Container Registry (ghcr.io) +# Red Hat Container Registry (quay.io) name: "Build Docker Images" on: @@ -8,7 +11,7 @@ on: push: paths: - - "qhub/template/image/**" + - "**" - ".github/workflows/image.yaml" branches: # Only on paths above @@ -40,27 +43,21 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - - name: Login to DockerHub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - name: Login to GitHub Container Registry if: github.event_name != 'pull_request' uses: docker/login-action@v1 with: registry: ghcr.io username: ${{ github.repository_owner }} - password: ${{ secrets.GITHUB_TOKEN }} + password: ${{ secrets.GH_TOKEN }} - - name: Login to Quay Container Registry - if: github.event_name != 'pull_request' - uses: docker/login-action@v1 - with: - registry: quay.io - username: ${{ secrets.QUAY_USERNAME }} - password: ${{ secrets.QUAY_TOKEN }} + # - name: Login to Quay Container Registry + # if: github.event_name != 'pull_request' + # uses: docker/login-action@v1 + # with: + # registry: quay.io + # username: ${{ secrets.QUAY_USERNAME }} + # password: ${{ secrets.QUAY_TOKEN }} - name: Lint Dockerfiles uses: jbergstroem/hadolint-gh-action@v1 @@ -75,7 +72,7 @@ jobs: with: # list of Docker images to use as base name for tags images: | - "quansight/qhub-${{ matrix.dockerfile }}" + "iameskild/nebari-${{ matrix.dockerfile }}" # generate Docker tags based on the following events/attributes tags: | type=ref,event=branch @@ -94,12 +91,10 @@ jobs: - name: Build docker uses: docker/build-push-action@v2 with: - # context: "./qhub/template/image" file: "Dockerfile.${{ matrix.dockerfile }}" tags: | - ${{ steps.meta.outputs.tags }} ghcr.io/${{ steps.meta.outputs.tags }} - quay.io/${{ steps.meta.outputs.tags }} + # quay.io/${{ steps.meta.outputs.tags }} push: ${{ github.event_name != 'pull_request' }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha From 59d2430dc1b679e6ce77c3fd8a2ef0986904d688 Mon Sep 17 00:00:00 2001 From: iameskild Date: Mon, 30 May 2022 16:33:37 -0700 Subject: [PATCH 03/27] Fix login --- .github/workflows/image.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index ea4f579..fb3b383 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -48,7 +48,8 @@ jobs: uses: docker/login-action@v1 with: registry: ghcr.io - username: ${{ github.repository_owner }} + # username: ${{ github.repository_owner }} + username: ${{ github.actor }} password: ${{ secrets.GH_TOKEN }} # - name: Login to Quay Container Registry @@ -71,6 +72,7 @@ jobs: uses: crazy-max/ghaction-docker-meta@v2 with: # list of Docker images to use as base name for tags + # FIX ME # images: | "iameskild/nebari-${{ matrix.dockerfile }}" # generate Docker tags based on the following events/attributes From 145cc45593da1ffbdc569579132117fcde5e0e92 Mon Sep 17 00:00:00 2001 From: iameskild Date: Mon, 30 May 2022 16:58:07 -0700 Subject: [PATCH 04/27] Add quay --- .github/workflows/image.yaml | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index fb3b383..f44166b 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -48,17 +48,16 @@ jobs: uses: docker/login-action@v1 with: registry: ghcr.io - # username: ${{ github.repository_owner }} - username: ${{ github.actor }} + username: ${{ github.repository_owner }} password: ${{ secrets.GH_TOKEN }} - # - name: Login to Quay Container Registry - # if: github.event_name != 'pull_request' - # uses: docker/login-action@v1 - # with: - # registry: quay.io - # username: ${{ secrets.QUAY_USERNAME }} - # password: ${{ secrets.QUAY_TOKEN }} + - name: Login to Quay Container Registry + if: github.event_name != 'pull_request' + uses: docker/login-action@v1 + with: + registry: quay.io + username: ${{ secrets.QUAY_USERNAME }} + password: ${{ secrets.QUAY_TOKEN }} - name: Lint Dockerfiles uses: jbergstroem/hadolint-gh-action@v1 @@ -96,7 +95,7 @@ jobs: file: "Dockerfile.${{ matrix.dockerfile }}" tags: | ghcr.io/${{ steps.meta.outputs.tags }} - # quay.io/${{ steps.meta.outputs.tags }} + quay.io/${{ steps.meta.outputs.tags }} push: ${{ github.event_name != 'pull_request' }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha From 03bd010a686818b903a7d743c484460487d60b2f Mon Sep 17 00:00:00 2001 From: iameskild Date: Mon, 30 May 2022 17:13:35 -0700 Subject: [PATCH 05/27] Add context --- .github/workflows/image.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index f44166b..efb3bdf 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -92,6 +92,7 @@ jobs: - name: Build docker uses: docker/build-push-action@v2 with: + context: . file: "Dockerfile.${{ matrix.dockerfile }}" tags: | ghcr.io/${{ steps.meta.outputs.tags }} From 6f76adb2d491019d0ea7d8389c07c9a6b99d3da8 Mon Sep 17 00:00:00 2001 From: iameskild Date: Mon, 30 May 2022 17:54:31 -0700 Subject: [PATCH 06/27] Push to dockerhub --- .github/workflows/image.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index efb3bdf..3538d8a 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -43,6 +43,12 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 + - name: Login to DockerHub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: Login to GitHub Container Registry if: github.event_name != 'pull_request' uses: docker/login-action@v1 From fd011c3942585f7091cb95dd882652578cb3b513 Mon Sep 17 00:00:00 2001 From: iameskild Date: Mon, 30 May 2022 17:59:27 -0700 Subject: [PATCH 07/27] Update org --- .github/workflows/image.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index 3538d8a..4213763 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -77,9 +77,8 @@ jobs: uses: crazy-max/ghaction-docker-meta@v2 with: # list of Docker images to use as base name for tags - # FIX ME # images: | - "iameskild/nebari-${{ matrix.dockerfile }}" + "nebari-dev/nebari-${{ matrix.dockerfile }}" # generate Docker tags based on the following events/attributes tags: | type=ref,event=branch From 0d7846b681305f3ccb788f5f593ab843ae154777 Mon Sep 17 00:00:00 2001 From: iameskild Date: Thu, 2 Jun 2022 09:17:34 -0700 Subject: [PATCH 08/27] Remove push to dockerhub --- .github/workflows/image.yaml | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index 4213763..d980db3 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -43,12 +43,6 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - - name: Login to DockerHub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - name: Login to GitHub Container Registry if: github.event_name != 'pull_request' uses: docker/login-action@v1 @@ -74,12 +68,11 @@ jobs: - name: Docker meta id: meta - uses: crazy-max/ghaction-docker-meta@v2 + uses: docker/metadata-action@v4 with: - # list of Docker images to use as base name for tags images: | - "nebari-dev/nebari-${{ matrix.dockerfile }}" - # generate Docker tags based on the following events/attributes + "quay.io/nebari-${{ matrix.dockerfile }}" + "ghcr.io/nebari-${{ matrix.dockerfile }}" tags: | type=ref,event=branch type=ref,event=tag @@ -99,9 +92,7 @@ jobs: with: context: . file: "Dockerfile.${{ matrix.dockerfile }}" - tags: | - ghcr.io/${{ steps.meta.outputs.tags }} - quay.io/${{ steps.meta.outputs.tags }} + tags: "{{ steps.meta.outputs.tags }}" push: ${{ github.event_name != 'pull_request' }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha From e8e8159f3eee18ba08ad6c4134d0c21584f95016 Mon Sep 17 00:00:00 2001 From: iameskild Date: Thu, 2 Jun 2022 09:22:27 -0700 Subject: [PATCH 09/27] fix --- .github/workflows/image.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index d980db3..e9f4035 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -92,7 +92,8 @@ jobs: with: context: . file: "Dockerfile.${{ matrix.dockerfile }}" - tags: "{{ steps.meta.outputs.tags }}" + tags: | + {{ steps.meta.outputs.tags }} push: ${{ github.event_name != 'pull_request' }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha From b94dbf2359352c4903288ab0c15d36af6f83b3e4 Mon Sep 17 00:00:00 2001 From: iameskild Date: Thu, 2 Jun 2022 09:24:58 -0700 Subject: [PATCH 10/27] fix --- .github/workflows/image.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index e9f4035..05ba90b 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -92,8 +92,7 @@ jobs: with: context: . file: "Dockerfile.${{ matrix.dockerfile }}" - tags: | - {{ steps.meta.outputs.tags }} + tags: ${{ steps.meta.outputs.tags }} push: ${{ github.event_name != 'pull_request' }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha From e0b9a64c16e911b63e4005daa214f9c20de87f53 Mon Sep 17 00:00:00 2001 From: iameskild Date: Thu, 2 Jun 2022 09:49:33 -0700 Subject: [PATCH 11/27] Add org --- .github/workflows/image.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index 05ba90b..6ac2466 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -43,7 +43,7 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - - name: Login to GitHub Container Registry + - name: Login to GitHub Container RegistryT if: github.event_name != 'pull_request' uses: docker/login-action@v1 with: @@ -71,8 +71,8 @@ jobs: uses: docker/metadata-action@v4 with: images: | - "quay.io/nebari-${{ matrix.dockerfile }}" - "ghcr.io/nebari-${{ matrix.dockerfile }}" + "quay.io/nebari/nebari-${{ matrix.dockerfile }}" + "ghcr.io/nebari-dev/nebari-${{ matrix.dockerfile }}" tags: | type=ref,event=branch type=ref,event=tag From 8ac6c9be79de4adafeca10e2e908268f8f0fa527 Mon Sep 17 00:00:00 2001 From: eskild <42120229+iameskild@users.noreply.github.com> Date: Thu, 16 Jun 2022 16:34:52 -0700 Subject: [PATCH 12/27] Update .github/workflows/image.yaml Co-authored-by: Tania Allard --- .github/workflows/image.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index 6ac2466..081875e 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -37,7 +37,7 @@ jobs: - jupyterhub - dask-worker steps: - - name: 'Checkout Infrastructure' + - name: 'Checkout Repository' uses: actions/checkout@main - name: Set up Docker Buildx From 3694acc7608d4c26e1d66ba87cda625dab63ab8f Mon Sep 17 00:00:00 2001 From: eskild <42120229+iameskild@users.noreply.github.com> Date: Thu, 16 Jun 2022 16:35:03 -0700 Subject: [PATCH 13/27] Update .github/workflows/image.yaml Co-authored-by: Tania Allard --- .github/workflows/image.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index 081875e..e48ab6b 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -38,7 +38,7 @@ jobs: - dask-worker steps: - name: 'Checkout Repository' - uses: actions/checkout@main + uses: actions/checkout@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 From ceb8c5da9099d5c4d77c11051128ae8c4dbfba52 Mon Sep 17 00:00:00 2001 From: eskild <42120229+iameskild@users.noreply.github.com> Date: Thu, 16 Jun 2022 16:35:13 -0700 Subject: [PATCH 14/27] Update .github/workflows/image.yaml Co-authored-by: Tania Allard --- .github/workflows/image.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index e48ab6b..608e1c3 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -41,7 +41,7 @@ jobs: uses: actions/checkout@v3 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 + uses: docker/setup-buildx-action@v2 - name: Login to GitHub Container RegistryT if: github.event_name != 'pull_request' From 304dc0f57b48ee77a384c9f647eeb22c185e03e9 Mon Sep 17 00:00:00 2001 From: eskild <42120229+iameskild@users.noreply.github.com> Date: Thu, 16 Jun 2022 16:35:28 -0700 Subject: [PATCH 15/27] Update .github/workflows/image.yaml Co-authored-by: Tania Allard --- .github/workflows/image.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index 608e1c3..267cdf0 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -43,7 +43,7 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - - name: Login to GitHub Container RegistryT + - name: Login to GitHub Container Registry if: github.event_name != 'pull_request' uses: docker/login-action@v1 with: From f54b5180c72e40fabfc8a569a40c12096b2d08a6 Mon Sep 17 00:00:00 2001 From: eskild <42120229+iameskild@users.noreply.github.com> Date: Thu, 16 Jun 2022 16:35:39 -0700 Subject: [PATCH 16/27] Update .github/workflows/image.yaml Co-authored-by: Tania Allard --- .github/workflows/image.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index 267cdf0..42fd28c 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -45,7 +45,7 @@ jobs: - name: Login to GitHub Container Registry if: github.event_name != 'pull_request' - uses: docker/login-action@v1 + uses: docker/login-action@v2 with: registry: ghcr.io username: ${{ github.repository_owner }} From 1af7d08219e55b320883f64d15b63f09c368d239 Mon Sep 17 00:00:00 2001 From: eskild <42120229+iameskild@users.noreply.github.com> Date: Thu, 16 Jun 2022 16:38:10 -0700 Subject: [PATCH 17/27] Update .github/workflows/image.yaml Co-authored-by: Tania Allard --- .github/workflows/image.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index 42fd28c..c82dbf6 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -53,7 +53,7 @@ jobs: - name: Login to Quay Container Registry if: github.event_name != 'pull_request' - uses: docker/login-action@v1 + uses: docker/login-action@v2 with: registry: quay.io username: ${{ secrets.QUAY_USERNAME }} From 118e1e33b34e81e545b523ec1325c2b4f52c8626 Mon Sep 17 00:00:00 2001 From: eskild <42120229+iameskild@users.noreply.github.com> Date: Thu, 16 Jun 2022 16:42:50 -0700 Subject: [PATCH 18/27] Update .github/workflows/image.yaml Co-authored-by: Tania Allard --- .github/workflows/image.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index c82dbf6..2934083 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -27,7 +27,7 @@ permissions: security-events: write jobs: - jupyterlab: + build-images: name: 'Build Docker Images' runs-on: ubuntu-latest strategy: From 31356acc2b93dbfdf612833c431476b745ca19b8 Mon Sep 17 00:00:00 2001 From: eskild <42120229+iameskild@users.noreply.github.com> Date: Thu, 16 Jun 2022 16:43:02 -0700 Subject: [PATCH 19/27] Update .github/workflows/image.yaml Co-authored-by: Tania Allard --- .github/workflows/image.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index 2934083..d2c4469 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -88,7 +88,7 @@ jobs: run: echo ::set-output name=docker_tag::$(echo "${{ steps.meta.outputs.tags }}" | sed -n 1p) - name: Build docker - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v3 with: context: . file: "Dockerfile.${{ matrix.dockerfile }}" From bf4f27e840fac7ad19edbbe8a5aa156bb22009d7 Mon Sep 17 00:00:00 2001 From: eskild <42120229+iameskild@users.noreply.github.com> Date: Thu, 16 Jun 2022 16:43:15 -0700 Subject: [PATCH 20/27] Update .github/workflows/image.yaml Co-authored-by: Tania Allard --- .github/workflows/image.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index d2c4469..75a2bda 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -87,7 +87,7 @@ jobs: id: var run: echo ::set-output name=docker_tag::$(echo "${{ steps.meta.outputs.tags }}" | sed -n 1p) - - name: Build docker + - name: Build docker images uses: docker/build-push-action@v3 with: context: . From 17771d85961ad072bac000c517bbf5a6ae02aeeb Mon Sep 17 00:00:00 2001 From: eskild <42120229+iameskild@users.noreply.github.com> Date: Thu, 16 Jun 2022 16:49:42 -0700 Subject: [PATCH 21/27] Update README.md Co-authored-by: Tania Allard --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a0b92cb..1aec90d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# docker-images +# nebari base Docker images 🌅 Docker images for the Nebari platform From d9cdc9e4e9a9445e157c2911599f3cd7ad751ed7 Mon Sep 17 00:00:00 2001 From: eskild <42120229+iameskild@users.noreply.github.com> Date: Thu, 16 Jun 2022 16:50:11 -0700 Subject: [PATCH 22/27] Update .github/workflows/image.yaml Co-authored-by: Tania Allard --- .github/workflows/image.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index 75a2bda..d2367af 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -66,7 +66,7 @@ jobs: output_format: tty error_level: 0 - - name: Docker meta + - name: Generate Docker images tags id: meta uses: docker/metadata-action@v4 with: From 36f9f0381f444829bf5f8cf2f8fa1b3216544fa0 Mon Sep 17 00:00:00 2001 From: iameskild Date: Fri, 17 Jun 2022 15:10:22 -0700 Subject: [PATCH 23/27] Changes based on review --- .../{image.yaml => build-push-docker.yaml} | 21 ++++----- .hadolint.yaml | 2 + README.md | 47 ++++++++++++++++--- 3 files changed, 50 insertions(+), 20 deletions(-) rename .github/workflows/{image.yaml => build-push-docker.yaml} (91%) create mode 100644 .hadolint.yaml diff --git a/.github/workflows/image.yaml b/.github/workflows/build-push-docker.yaml similarity index 91% rename from .github/workflows/image.yaml rename to .github/workflows/build-push-docker.yaml index d2367af..1192375 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/build-push-docker.yaml @@ -1,23 +1,17 @@ -# Build and push images to : +# Build and push images to: # GitHub Container Registry (ghcr.io) # Red Hat Container Registry (quay.io) name: "Build Docker Images" on: - create: # Branch (so that the Docker image tags exist for a new branch when pushed) - # even if nothing on 'paths' below is changed. - branches: - - '**' - push: + branches: + - main paths: - - "**" + - "Dockerfile.*" + - "*/environment.yaml" - ".github/workflows/image.yaml" - - branches: # Only on paths above - - '**' - - tags: # Always, regardless of paths above + tags: - '*' permissions: @@ -98,8 +92,9 @@ jobs: cache-from: type=gha cache-to: type=gha,mode=max - - uses: actions/cache@v2.1.4 + - name: Enable caching for Trivy if: ${{ github.event_name == 'pull_request' }} + uses: actions/cache@v2.1.4 with: path: .trivy key: ${{ runner.os }}-trivy-${{ github.run_id }} diff --git a/.hadolint.yaml b/.hadolint.yaml new file mode 100644 index 0000000..d16a3a9 --- /dev/null +++ b/.hadolint.yaml @@ -0,0 +1,2 @@ +ignored: + - DL3048 # style complaint: Invalid Label Key \ No newline at end of file diff --git a/README.md b/README.md index 1aec90d..d4d78e0 100644 --- a/README.md +++ b/README.md @@ -2,23 +2,56 @@ 🌅 Docker images for the Nebari platform -## Pinning +[![Build Docker Images](https://github.com/nebari-dev/nebari-docker-images/actions/workflows/build-push-docker.yaml/badge.svg)] -It is extremely important to pin specific packages: +This repo contains the source code for Docker (container) images used by the Nebari platform. This repo also contains an automated means of building and pushing these images to public container registries. Currently these images are built and pushed to the following registries: -- dask -- dask-gateway +GitHub Container Registry (ghcr.io) +- [`nebari-jupyterlab`](https://github.com/orgs/nebari-dev/packages/container/package/nebari-jupyterlab) +- [`nebari-jupyterhub`](https://github.com/orgs/nebari-dev/packages/container/package/nebari-jupyterhub) +- [nebari-dask-worker](https://github.com/orgs/nebari-dev/packages/container/package/nebari-dask-worker) -## Building Dockerfile +Quay Container Registry (quay.io) +- [`nebari-jupyterlab`](https://quay.io/repository/nebari/nebari-jupyterlab) +- [`nebari-jupyterhub`](https://quay.io/repository/nebari/nebari-jupyterhub) +- [`nebari-dask-worker`](https://quay.io/repository/nebari/nebari-dask-worker) + +## Getting started + +Whether you want to contribute to this project or simply wish use these images, to get started, fork this repo and then clone the forked repo onto your local machine. + +### pre-requisite + +Currently the only pre-requisite is that you have [`docker` installed](https://docs.docker.com/get-docker/) on your local machine. + +### Building Dockerfile + +Assuming you are in the repos root folder, you can build these images locally by running the listed commands. + +For JupyterLab ```shell docker build -f Dockerfile.jupyterlab -t qhub-jupyterlab:latest . ``` +For JupyterHub ```shell -docker build -f Dockerfile.dask-gateway -t qhub-dask-gateway:latest . +docker build -f Dockerfile.dask-worker -t qhub-dask-worker:latest . ``` +For Dask-Worker ```shell -docker build -f Dockerfile.dask-worker -t qhub-dask-worker:latest . +docker build -f Dockerfile.dask-gateway -t qhub-dask-gateway:latest . ``` + +> NOTE: it is extremely important to pin specific packages `dask-gateway` and `distributed` as they need to be running the same version for the dask-workers to work as expected. + + +### Reporting an issue + +If you encounter an issue, feel free to open an issue [here](https://github.com/nebari-dev/nebari-docker-images/issues/new/choose). + + +## License + +TBD \ No newline at end of file From 9240d286b090d0349cd5025f31278ad527c61eff Mon Sep 17 00:00:00 2001 From: eskild <42120229+iameskild@users.noreply.github.com> Date: Fri, 17 Jun 2022 15:12:32 -0700 Subject: [PATCH 24/27] Update scripts/install-conda.sh Co-authored-by: Tania Allard --- scripts/install-conda.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install-conda.sh b/scripts/install-conda.sh index 3f167b2..d92b4a8 100755 --- a/scripts/install-conda.sh +++ b/scripts/install-conda.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -xe # Requires environment CONDA_SHA256, CONDA_VERSION, and DEFAULT_ENV -wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-$CONDA_VERSION-Linux-x86_64.sh +wget --quiet -O miniconda.sh https://repo.anaconda.com/miniconda/Miniconda3-$CONDA_VERSION-Linux-x86_64.sh echo "${CONDA_SHA256} Miniconda3-$CONDA_VERSION-Linux-x86_64.sh" > miniconda.checksum From 38d0d47613dfa87b2c30502395650fa8d9f46806 Mon Sep 17 00:00:00 2001 From: eskild <42120229+iameskild@users.noreply.github.com> Date: Fri, 17 Jun 2022 15:14:00 -0700 Subject: [PATCH 25/27] Update scripts/install-conda.sh Co-authored-by: Tania Allard --- scripts/install-conda.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install-conda.sh b/scripts/install-conda.sh index d92b4a8..a3c94ff 100755 --- a/scripts/install-conda.sh +++ b/scripts/install-conda.sh @@ -3,7 +3,7 @@ set -xe # Requires environment CONDA_SHA256, CONDA_VERSION, and DEFAULT_ENV wget --quiet -O miniconda.sh https://repo.anaconda.com/miniconda/Miniconda3-$CONDA_VERSION-Linux-x86_64.sh -echo "${CONDA_SHA256} Miniconda3-$CONDA_VERSION-Linux-x86_64.sh" > miniconda.checksum +echo "${CONDA_SHA256} miniconda.sh" > miniconda.checksum if [ $(sha256sum -c miniconda.checksum | awk '{print $2}') != "OK" ]; then echo Error when testing checksum From a436968ff60a57083abdc1d3cc89897946d4fa79 Mon Sep 17 00:00:00 2001 From: eskild <42120229+iameskild@users.noreply.github.com> Date: Fri, 17 Jun 2022 15:14:14 -0700 Subject: [PATCH 26/27] Update scripts/install-conda.sh Co-authored-by: Tania Allard --- scripts/install-conda.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/install-conda.sh b/scripts/install-conda.sh index a3c94ff..40f6642 100755 --- a/scripts/install-conda.sh +++ b/scripts/install-conda.sh @@ -10,7 +10,6 @@ if [ $(sha256sum -c miniconda.checksum | awk '{print $2}') != "OK" ]; then exit 1; fi -mv Miniconda3-$CONDA_VERSION-Linux-x86_64.sh miniconda.sh sh ./miniconda.sh -b -p /opt/conda rm miniconda.sh miniconda.checksum From 4d6135579861f6fe96cf502fc6dff2c19702d952 Mon Sep 17 00:00:00 2001 From: Tania Allard Date: Thu, 14 Jul 2022 12:50:26 +0100 Subject: [PATCH 27/27] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Minor=20rewording=20?= =?UTF-8?q?prior=20to=20merge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index d4d78e0..0c1b150 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ This repo contains the source code for Docker (container) images used by the Neb GitHub Container Registry (ghcr.io) - [`nebari-jupyterlab`](https://github.com/orgs/nebari-dev/packages/container/package/nebari-jupyterlab) - [`nebari-jupyterhub`](https://github.com/orgs/nebari-dev/packages/container/package/nebari-jupyterhub) -- [nebari-dask-worker](https://github.com/orgs/nebari-dev/packages/container/package/nebari-dask-worker) +- [`nebari-dask-worker`](https://github.com/orgs/nebari-dev/packages/container/package/nebari-dask-worker) Quay Container Registry (quay.io) - [`nebari-jupyterlab`](https://quay.io/repository/nebari/nebari-jupyterlab) @@ -21,13 +21,13 @@ Quay Container Registry (quay.io) Whether you want to contribute to this project or simply wish use these images, to get started, fork this repo and then clone the forked repo onto your local machine. -### pre-requisite +### Pre-requisites Currently the only pre-requisite is that you have [`docker` installed](https://docs.docker.com/get-docker/) on your local machine. ### Building Dockerfile -Assuming you are in the repos root folder, you can build these images locally by running the listed commands. +Assuming you are in the repo's root folder, you can build these images locally by running the listed commands on your terminal. For JupyterLab ```shell @@ -44,7 +44,8 @@ For Dask-Worker docker build -f Dockerfile.dask-gateway -t qhub-dask-gateway:latest . ``` -> NOTE: it is extremely important to pin specific packages `dask-gateway` and `distributed` as they need to be running the same version for the dask-workers to work as expected. +> **NOTE** +> It is extremely important to pin specific packages `dask-gateway` and `distributed` as they need to run the same version for the dask-workers to work as expected. ### Reporting an issue