diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 2a4f5c18..23a0373f 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -2,9 +2,6 @@ name: generate_docker on: push: branches: ['develop'] -# Warning : schedule is only for default branch -# schedule: -# - cron: '0 3 * * 1' defaults: run: shell: bash @@ -29,54 +26,306 @@ jobs: docker: runs-on: ubuntu-latest env: - IMAGE_NAME: sedfoam_2406_ubuntu - needs: build + REGISTRY_IMAGE: cbonamy/openfoam_2406_ubuntu + #needs: build + strategy: + fail-fast: false + matrix: + platform: + - linux/amd64 + - linux/arm64 steps: - name: Checkout repository uses: actions/checkout@v3 - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + + - name: Prepare + run: | + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 with: - platforms: 'arm64' + images: ${{ env.REGISTRY_IMAGE }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - name: Login to DockerHub - uses: docker/login-action@v2 + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Build and push - uses: docker/build-push-action@v3 + + - name: Build and push by digest + id: build + uses: docker/build-push-action@v6 with: + platforms: ${{ matrix.platform }} + labels: ${{ steps.meta.outputs.labels }} + outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true context: docker - push: true - platforms: linux/amd64,linux/arm64 - tags: cbonamy/${{ env.IMAGE_NAME }}:latest + file: docker/Dockerfile_fordev + #tags: ${{ env.REGISTRY_IMAGE }} - docker_nb: + - name: Export digest + run: | + mkdir -p /tmp/digests + digest="${{ steps.build.outputs.digest }}" + touch "/tmp/digests/${digest#sha256:}" + + - name: Upload digest + uses: actions/upload-artifact@v4 + with: + name: digests-${{ env.PLATFORM_PAIR }} + path: /tmp/digests/* + if-no-files-found: error + retention-days: 1 + + merge: runs-on: ubuntu-latest env: - IMAGE_NAME: sedfoam_2406_notebook - needs: docker + REGISTRY_IMAGE: cbonamy/openfoam_2406_ubuntu + needs: + - docker + steps: + - name: Download digests + uses: actions/download-artifact@v4 + with: + path: /tmp/digests + pattern: digests-* + merge-multiple: true + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY_IMAGE }} + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Create manifest list and push + working-directory: /tmp/digests + run: | + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *) + - name: Inspect image + run: | + docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} + + docker-2: + runs-on: ubuntu-latest + env: + REGISTRY_IMAGE: cbonamy/sedfoam_2406_ubuntu + needs: merge + strategy: + fail-fast: false + matrix: + platform: + - linux/amd64 + - linux/arm64 steps: - name: Checkout repository uses: actions/checkout@v3 + + - name: Prepare + run: | + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY_IMAGE }} + - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push by digest + id: build + uses: docker/build-push-action@v6 + with: + platforms: ${{ matrix.platform }} + labels: ${{ steps.meta.outputs.labels }} + outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true + context: docker + file: docker/Dockerfile_comp + #tags: ${{ env.REGISTRY_IMAGE }} + + + - name: Export digest + run: | + mkdir -p /tmp/digests + digest="${{ steps.build.outputs.digest }}" + touch "/tmp/digests/${digest#sha256:}" + + - name: Upload digest + uses: actions/upload-artifact@v4 + with: + name: digests2-${{ env.PLATFORM_PAIR }} + path: /tmp/digests/* + if-no-files-found: error + retention-days: 1 + + merge-2: + runs-on: ubuntu-latest + env: + REGISTRY_IMAGE: cbonamy/sedfoam_2406_ubuntu + needs: + - docker-2 + steps: + - name: Download digests + uses: actions/download-artifact@v4 with: - platforms: 'arm64,arm' + path: /tmp/digests + pattern: digests2-* + merge-multiple: true + - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - name: Login to DockerHub - uses: docker/login-action@v2 + uses: docker/setup-buildx-action@v3 + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY_IMAGE }} + + - name: Login to Docker Hub + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Build and push - uses: docker/build-push-action@v3 + + - name: Create manifest list and push + working-directory: /tmp/digests + run: | + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *) + + - name: Inspect image + run: | + docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} + + docker-nb: + runs-on: ubuntu-latest + env: + REGISTRY_IMAGE: cbonamy/sedfoam_2406_notebook + needs: merge-2 + strategy: + fail-fast: false + matrix: + platform: + - linux/amd64 + - linux/arm64 + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Prepare + run: | + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 with: + images: ${{ env.REGISTRY_IMAGE }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push by digest + id: build + uses: docker/build-push-action@v6 + with: + platforms: ${{ matrix.platform }} + labels: ${{ steps.meta.outputs.labels }} + outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true context: docker file: docker/Dockerfile_nb - push: true - platforms: linux/amd64,linux/arm64 - tags: cbonamy/${{ env.IMAGE_NAME }}:latest + #tags: ${{ env.REGISTRY_IMAGE }} + + + - name: Export digest + run: | + mkdir -p /tmp/digests + digest="${{ steps.build.outputs.digest }}" + touch "/tmp/digests/${digest#sha256:}" + + - name: Upload digest + uses: actions/upload-artifact@v4 + with: + name: digests3-${{ env.PLATFORM_PAIR }} + path: /tmp/digests/* + if-no-files-found: error + retention-days: 1 + + merge-nb: + runs-on: ubuntu-latest + env: + REGISTRY_IMAGE: cbonamy/sedfoam_2406_notebook + needs: + - docker-nb + steps: + - name: Download digests + uses: actions/download-artifact@v4 + with: + path: /tmp/digests + pattern: digests3-* + merge-multiple: true + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY_IMAGE }} + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Create manifest list and push + working-directory: /tmp/digests + run: | + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *) + + - name: Inspect image + run: | + docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} diff --git a/.github/workflows/docker.yml.old b/.github/workflows/docker.yml.old new file mode 100644 index 00000000..79765960 --- /dev/null +++ b/.github/workflows/docker.yml.old @@ -0,0 +1,79 @@ +name: generate_docker +on: + push: + branches: ['develop'] +defaults: + run: + shell: bash +jobs: + + build: + runs-on: ubuntu-latest + container: opencfd/openfoam-dev:2406 + steps: + - name: install git + run: | + apt-get update && apt-get install -y git + - name: Check out repository code + uses: actions/checkout@v3 + with: + submodules: recursive + - name: Build sedfoam + run: | + shopt -s expand_aliases && source /openfoam/bash.rc && + export FOAM_USER_LIBBIN=$FOAM_SITE_LIBBIN && ./Allwmake -prefix=group + + docker: + runs-on: ubuntu-latest + env: + IMAGE_NAME: sedfoam_2406_ubuntu + needs: build + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push + uses: docker/build-push-action@v6 + with: + platforms: linux/amd64 + push: true + tags: cbonamy/${{ env.IMAGE_NAME }}:latest + context: docker + + docker_nb: + runs-on: ubuntu-latest + env: + IMAGE_NAME: sedfoam_2406_notebook +# needs: docker + steps: + - name: Checkout repository + uses: actions/checkout@v3 + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Login to DockerHub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v6 + with: + context: docker + file: docker/Dockerfile_nb + push: true + platforms: linux/amd64 #,linux/arm64/v8 + tags: cbonamy/${{ env.IMAGE_NAME }}:latest diff --git a/.github/workflows/docker_arm.yml.old b/.github/workflows/docker_arm.yml.old new file mode 100644 index 00000000..63f70bff --- /dev/null +++ b/.github/workflows/docker_arm.yml.old @@ -0,0 +1,110 @@ +name: generate_docker_arm +on: + push: + branches: ['develop'] +defaults: + run: + shell: bash +jobs: + + build: + runs-on: ubuntu-latest + container: opencfd/openfoam-dev:2406 + steps: + - name: install git + run: | + apt-get update && apt-get install -y git + - name: Check out repository code + uses: actions/checkout@v3 + with: + submodules: recursive + - name: Build sedfoam + run: | + shopt -s expand_aliases && source /openfoam/bash.rc && + export FOAM_USER_LIBBIN=$FOAM_SITE_LIBBIN && ./Allwmake -prefix=group + + docker: + runs-on: ubuntu-latest + env: + IMAGE_NAME: openfoam_2406_ubuntu + needs: build + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push + uses: docker/build-push-action@v6 + with: + file: docker/Dockerfile_fordev + platforms: linux/arm64/v8 + push: true + tags: cbonamy/${{ env.IMAGE_NAME }}:latest + context: docker + + docker-2: + runs-on: ubuntu-latest + env: + IMAGE_NAME: sedfoam_2406_ubuntu + needs: docker + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push + uses: docker/build-push-action@v6 + with: + file: docker/Dockerfile_comp + platforms: linux/arm64/v8 + push: true + tags: cbonamy/${{ env.IMAGE_NAME }}:latest + context: docker + + docker_nb: + runs-on: ubuntu-latest + env: + IMAGE_NAME: sedfoam_2406_notebook +# needs: docker-2 + steps: + - name: Checkout repository + uses: actions/checkout@v3 + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Login to DockerHub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v6 + with: + context: docker + file: docker/Dockerfile_nb + push: true + platforms: linux/arm64/v8 + tags: cbonamy/${{ env.IMAGE_NAME }}:latest diff --git a/README.md b/README.md index 1aa55563..6f787445 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,9 @@ sedfoam ======= [![Release](https://img.shields.io/badge/release-2406-blue.svg)](http://github.com/SedFoam/sedfoam) -[![sedFoam](https://circleci.com/gh/SedFoam/sedfoam.svg?style=shield)](https://circleci.com/gh/SedFoam/sedfoam) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/b9ad60ec6171496290c336697426cd48)](https://www.codacy.com/gh/SedFoam/sedfoam/dashboard?utm_source=github.com&utm_medium=referral&utm_content=SedFoam/sedfoam&utm_campaign=Badge_Grade) +[![OpenFOAM v24xx](https://img.shields.io/badge/OpenFOAM-v24xx-brightgreen.svg)](https://openfoam.com/) +[![OpenFOAM v23xx](https://img.shields.io/badge/OpenFOAM-v23xx-brightgreen.svg)](https://openfoam.com/) [![OpenFOAM v22xx](https://img.shields.io/badge/OpenFOAM-v22xx-brightgreen.svg)](https://openfoam.com/) [![OpenFOAM v21xx](https://img.shields.io/badge/OpenFOAM-v21xx-brightgreen.svg)](https://openfoam.com/) [![OpenFOAM v20xx](https://img.shields.io/badge/OpenFOAM-v20xx-brightgreen.svg)](https://openfoam.com/) diff --git a/docker/Dockerfile b/docker/Dockerfile index b445f229..d2596057 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -5,9 +5,10 @@ ARG DEBIAN_FRONTEND=noninteractive RUN update-ca-certificates && apt-get update \ && apt-get install --no-install-recommends -y \ - python3-pip python3-dev python3-venv python-is-python3 ipython3 \ - unzip git mercurial meld libreadline-dev vim nano emacs python3-pandas \ - texlive dvipng python3-tk cm-super texlive-latex-extra python3-netcdf4 python3-venv \ + python3-pip python3-dev python-is-python3 ipython3 python3-tk \ + unzip git mercurial libreadline-dev vim nano emacs python3-venv \ + #cm-super meld \ + #texlive dvipng texlive-latex-extra python3-netcdf4 python3-pandas \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* RUN python3 -m venv /home/sudofoam/pyenv @@ -24,7 +25,7 @@ WORKDIR /root/swak4Foam RUN /bin/bash -c 'shopt -s expand_aliases && ./maintainanceScripts/compileRequirements.sh' WORKDIR /root/swak4Foam -RUN /bin/bash -c 'shopt -s expand_aliases && source /openfoam/bash.rc && export FOAM_USER_LIBBIN=$FOAM_SITE_LIBBIN && export FOAM_USER_APPBIN=$FOAM_SITE_APPBIN && export WM_NCOMPPROCS=1 && ./Allwmake' +RUN /bin/bash -c 'shopt -s expand_aliases && source /openfoam/bash.rc && export FOAM_USER_LIBBIN=$FOAM_SITE_LIBBIN && export FOAM_USER_APPBIN=$FOAM_SITE_APPBIN && export SWAK_COMPILE_GRAMMAR_OPTION=-O1 && export WM_NCOMPPROCS=1 && ./Allwmake' WORKDIR /root/sedfoam RUN /bin/bash -c 'shopt -s expand_aliases && source /openfoam/bash.rc && export FOAM_USER_LIBBIN=$FOAM_SITE_LIBBIN && ./Allwmake -prefix=group' diff --git a/docker/Dockerfile_comp b/docker/Dockerfile_comp new file mode 100644 index 00000000..c3ea8946 --- /dev/null +++ b/docker/Dockerfile_comp @@ -0,0 +1,21 @@ +FROM cbonamy/openfoam_2406_ubuntu:develop +LABEL maintainer="cyrille.bonamy@univ-grenoble-alpes.fr" +ARG WM_NCOMPPROCS=10 +ARG DEBIAN_FRONTEND=noninteractive + +USER root + +WORKDIR /root/swak4Foam +RUN /bin/bash -c 'shopt -s expand_aliases && source /openfoam/bash.rc && export FOAM_USER_LIBBIN=$FOAM_SITE_LIBBIN && export FOAM_USER_APPBIN=$FOAM_SITE_APPBIN && export SWAK_COMPILE_GRAMMAR_OPTION=-O1 && export WM_NCOMPPROCS=1 && ./Allwmake' + +WORKDIR /root/sedfoam +RUN /bin/bash -c 'shopt -s expand_aliases && source /openfoam/bash.rc && export FOAM_USER_LIBBIN=$FOAM_SITE_LIBBIN && ./Allwmake -prefix=group' + +USER 1001 + +WORKDIR /home/sudofoam +RUN sudo cp -r /root/sedfoam sedfoam && sudo chown -R sudofoam: /home/sudofoam && sudo rm -rf /root/* + +WORKDIR /home/sudofoam +ENV HOME=/home/sudofoam +ENTRYPOINT ["/bin/bash", "-c"] diff --git a/docker/Dockerfile_fordev b/docker/Dockerfile_fordev new file mode 100644 index 00000000..449743a7 --- /dev/null +++ b/docker/Dockerfile_fordev @@ -0,0 +1,32 @@ +FROM opencfd/openfoam-default:2406 +LABEL maintainer="cyrille.bonamy@univ-grenoble-alpes.fr" +ARG WM_NCOMPPROCS=10 +ARG DEBIAN_FRONTEND=noninteractive + +RUN update-ca-certificates && apt-get update \ + && apt-get install --no-install-recommends -y \ + python3-pip python3-dev python-is-python3 ipython3 python3-tk \ + unzip git mercurial libreadline-dev vim nano emacs python3-venv \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* +RUN python3 -m venv /home/sudofoam/pyenv + +RUN /bin/bash -c 'shopt -s expand_aliases && source /home/sudofoam/pyenv/bin/activate && pip3 install --no-cache-dir fluidfoam pandas matplotlib odfpy black' + +WORKDIR /root/ +RUN git clone --branch develop --recurse-submodules https://github.com/sedfoam/sedfoam.git --depth 1 + +WORKDIR /root +RUN /bin/bash -c 'hg clone http://hg.code.sf.net/p/openfoam-extend/swak4Foam -b develop && cp sedfoam/docker/Allwmakeswak swak4Foam/Libraries/Allwmake' + +WORKDIR /root/swak4Foam +RUN /bin/bash -c 'shopt -s expand_aliases && ./maintainanceScripts/compileRequirements.sh' + +USER 1001 + +WORKDIR /home/sudofoam +RUN echo "source /home/sudofoam/pyenv/bin/activate" >> .bashrc + +WORKDIR /home/sudofoam +ENV HOME=/home/sudofoam +ENTRYPOINT ["/bin/bash", "-c"] diff --git a/docker/Dockerfile_nb b/docker/Dockerfile_nb index 911f72aa..845e5a7d 100644 --- a/docker/Dockerfile_nb +++ b/docker/Dockerfile_nb @@ -1,4 +1,4 @@ -FROM cbonamy/sedfoam_2406_ubuntu +FROM cbonamy/sedfoam_2406_ubuntu:develop LABEL maintainer="cyrille.bonamy@univ-grenoble-alpes.fr" ARG WM_NCOMPPROCS=10 @@ -25,7 +25,6 @@ RUN update-ca-certificates && apt-get update \ libxext-dev \ libxrender1 \ lmodern \ - netcat \ python3-dev \ python3-netcdf4 \ python3-pandas \ @@ -83,10 +82,6 @@ USER 1001 ARG PYTHON_VERSION=default -# Setup work directory for backward-compatibility -# RUN mkdir "/home/${NB_USER}/work" && \ -# fix-permissions "/home/${NB_USER}" - # Download and install Micromamba, and initialize Conda prefix. # # Similar projects using Micromamba: @@ -125,9 +120,7 @@ RUN set -x && \ rm micromamba && \ # Pin major.minor version of python # mamba list python | grep '^python ' | tr -s ' ' | cut -d ' ' -f 1,2 >> "${CONDA_DIR}/conda-meta/pinned" && \ - mamba clean --all -f -y && \ - fix-permissions "${CONDA_DIR}" && \ - fix-permissions "/home/${NB_USER}" + mamba clean --all -f -y RUN mamba install -c conda-forge --quiet --yes \ 'pandas' \ @@ -135,15 +128,13 @@ RUN mamba install -c conda-forge --quiet --yes \ 'notebook' \ 'nbclassic' \ 'netCDF4' \ -# 'jupyterhub' \ 'jupyterlab' && \ + mamba update jupyter_client && \ jupyter notebook --generate-config && \ mamba clean --all -f -y && \ npm cache clean --force && \ jupyter lab clean && \ rm -rf "/home/${NB_USER}/.cache/yarn" && \ -# fix-permissions "${CONDA_DIR}" && \ -# fix-permissions "/home/${NB_USER}" && \ pip3 install fluidfoam odfpy ENV JUPYTER_PORT=8888