diff --git a/ubuntu-clang/Dockerfile b/ubuntu-clang/Dockerfile index fb00b0c..b03cb88 100644 --- a/ubuntu-clang/Dockerfile +++ b/ubuntu-clang/Dockerfile @@ -19,56 +19,56 @@ RUN apt-get -yqq install clang-15 libc++-15-dev libc++abi-15-dev libomp-15-dev # What we want to install and how we want to install it # is specified in a manifest file (spack.yaml) RUN mkdir /opt/spack-environment \ -&& (echo "spack:" \ -&& echo " compilers:" \ -&& echo " - compiler:" \ -&& echo " spec: clang@15.0.3" \ -&& echo " paths:" \ -&& echo " cc: /usr/bin/clang-15" \ -&& echo " cxx: /usr/bin/clang++-15" \ -&& echo " f77:" \ -&& echo " fc:" \ -&& echo " flags:" \ -&& echo " cxxflags: -stdlib=libc++" \ -&& echo " operating_system: ubuntu22.04" \ -&& echo " target: x86_64" \ -&& echo " modules: []" \ -&& echo " environment: {}" \ -&& echo " extra_rpaths:" \ -&& echo " - /lib/gcc/x86_64-linux-gnu/11/libgfortran.so" \ -&& echo " packages:" \ -&& echo " all:" \ -&& echo " target:" \ -&& echo " - x86_64_v2" \ -&& echo " compiler:" \ -&& echo " - clang" \ -&& echo " providers:" \ -&& echo " mpi:" \ -&& echo " - mpich" \ -&& echo " blas:" \ -&& echo " - openblas" \ -&& echo " lapack:" \ -&& echo " - openblas" \ -&& echo " specs:" \ -&& echo " - mpich~fortran device=ch4 netmod=ofi" \ -&& echo " - openblas@develop~fortran" \ -&& echo " - petsc@main~fortran+debug" \ -&& echo " - hdf5@1.12.2+hl+mpi~fortran" \ -&& echo " - fftw+mpi+openmp" \ -&& echo " - cmake" \ -&& echo " - gsl" \ -&& echo " - python+pythoncmd" \ -&& echo " - py-pyparsing" \ -&& echo " - py-numpy" \ -&& echo " - py-mpi4py" \ -&& echo " - py-h5py+mpi" \ -&& echo " - py-pytest" \ -&& echo " - ninja" \ -&& echo " concretizer:" \ -&& echo " unify: true" \ -&& echo " view: /opt/view" \ -&& echo " config:" \ -&& echo " install_tree: /opt/software") > /opt/spack-environment/spack.yaml +&& (echo spack: \ +&& echo ' compilers:' \ +&& echo ' - compiler:' \ +&& echo ' spec: clang@15.0.3' \ +&& echo ' paths:' \ +&& echo ' cc: /usr/bin/clang-15' \ +&& echo ' cxx: /usr/bin/clang++-15' \ +&& echo ' f77: null' \ +&& echo ' fc: null' \ +&& echo ' flags:' \ +&& echo ' cxxflags: -stdlib=libc++' \ +&& echo ' operating_system: ubuntu22.04' \ +&& echo ' modules: []' \ +&& echo ' environment: {}' \ +&& echo ' extra_rpaths: []' \ +&& echo ' packages:' \ +&& echo ' all:' \ +&& echo ' target:' \ +&& echo ' - x86_64_v2' \ +&& echo ' compiler:' \ +&& echo ' - clang' \ +&& echo ' providers:' \ +&& echo ' # Cannot use intel-oneapi-mpi with clang' \ +&& echo ' # for some reason, so use mpich for now.' \ +&& echo ' mpi:' \ +&& echo ' - mpich' \ +&& echo ' blas:' \ +&& echo ' - openblas' \ +&& echo ' lapack:' \ +&& echo ' - openblas' \ +&& echo ' specs:' \ +&& echo ' - mpich~fortran device=ch4 netmod=ofi' \ +&& echo ' - openblas@develop~fortran' \ +&& echo ' - petsc@main~fortran+debug' \ +&& echo ' - hdf5+hl+mpi~fortran' \ +&& echo ' - fftw+mpi+openmp' \ +&& echo ' - cmake' \ +&& echo ' - gsl' \ +&& echo ' - python+pythoncmd' \ +&& echo ' - py-pyparsing' \ +&& echo ' - py-numpy' \ +&& echo ' - py-mpi4py' \ +&& echo ' - py-h5py+mpi' \ +&& echo ' - py-pytest' \ +&& echo ' - ninja' \ +&& echo ' concretizer:' \ +&& echo ' unify: true' \ +&& echo ' view: /opt/views/view' \ +&& echo ' config:' \ +&& echo ' install_tree: /opt/software') > /opt/spack-environment/spack.yaml # Find externals RUN spack external find tar @@ -80,24 +80,33 @@ RUN spack external find gettext RUN cd /opt/spack-environment && spack env activate . && spack install --fail-fast && spack gc -y # Strip all the binaries -RUN find -L /opt/view/* -type f -exec readlink -f '{}' \; | \ +RUN find -L /opt/views/view/* -type f -exec readlink -f '{}' \; | \ xargs file -i | \ grep 'charset=binary' | \ grep 'x-executable\|x-archive\|x-sharedlib' | \ - awk -F: '{print $1}' | xargs strip -s + awk -F: '{print $1}' | xargs strip # Modifications to the environment that are necessary to run RUN cd /opt/spack-environment && \ - spack env activate --sh -d . >> /etc/profile.d/z10_spack_environment.sh + spack env activate --sh -d . > activate.sh + # Bare OS image to run the installed executables FROM ubuntu:22.04 COPY --from=builder /opt/spack-environment /opt/spack-environment COPY --from=builder /opt/software /opt/software -COPY --from=builder /opt/._view /opt/._view -COPY --from=builder /opt/view /opt/view -COPY --from=builder /etc/profile.d/z10_spack_environment.sh /etc/profile.d/z10_spack_environment.sh + +# paths.view is a symlink, so copy the parent to avoid dereferencing and duplicating it +COPY --from=builder /opt/views /opt/views + +RUN { \ + echo '#!/bin/sh' \ + && echo '.' /opt/spack-environment/activate.sh \ + && echo 'exec "$@"'; \ + } > /entrypoint.sh \ +&& chmod a+x /entrypoint.sh \ +&& ln -s /opt/views/view /opt/view # Noninteractive install! ENV DEBIAN_FRONTEND=noninteractive \ @@ -116,6 +125,6 @@ RUN apt-get -yqq install clang-15 libc++-15-dev libc++abi-15-dev libomp-15-dev RUN apt-get -yqq update && apt-get -yqq upgrade \ && apt-get -yqq install build-essential bash git tar wget \ && rm -rf /var/lib/apt/lists/* -ENTRYPOINT ["/bin/bash", "--rcfile", "/etc/profile", "-l", "-c", "$*", "--" ] +ENTRYPOINT [ "/entrypoint.sh" ] CMD [ "/bin/bash" ] diff --git a/ubuntu-clang/spack.yaml b/ubuntu-clang/spack.yaml index 9dc94d6..15e1df3 100644 --- a/ubuntu-clang/spack.yaml +++ b/ubuntu-clang/spack.yaml @@ -14,11 +14,9 @@ spack: flags: cxxflags: -stdlib=libc++ operating_system: ubuntu22.04 - target: x86_64 modules: [] environment: {} - extra_rpaths: - - /lib/gcc/x86_64-linux-gnu/11/libgfortran.so + extra_rpaths: [] packages: all: target: @@ -38,7 +36,7 @@ spack: - mpich~fortran device=ch4 netmod=ofi - openblas@develop~fortran - petsc@main~fortran+debug - - hdf5@1.12.2+hl+mpi~fortran + - hdf5+hl+mpi~fortran - fftw+mpi+openmp - cmake - gsl diff --git a/ubuntu-gcc/Dockerfile b/ubuntu-gcc/Dockerfile index fd9aa94..8791563 100644 --- a/ubuntu-gcc/Dockerfile +++ b/ubuntu-gcc/Dockerfile @@ -12,36 +12,36 @@ RUN sed -i 's/platform.release()/"5.4.100"/g' /opt/spack/var/spack/repos/builtin # What we want to install and how we want to install it # is specified in a manifest file (spack.yaml) RUN mkdir /opt/spack-environment \ -&& (echo "spack:" \ -&& echo " packages:" \ -&& echo " all:" \ -&& echo " target:" \ -&& echo " - x86_64_v2" \ -&& echo " providers:" \ -&& echo " mpi:" \ -&& echo " - mpich" \ -&& echo " blas:" \ -&& echo " - openblas" \ -&& echo " lapack:" \ -&& echo " - openblas" \ -&& echo " specs:" \ -&& echo " - hdf5@1.12.2+hl+mpi~fortran" \ -&& echo " - mpich~fortran device=ch4 netmod=ofi" \ -&& echo " - petsc@main~fortran+debug" \ -&& echo " - fftw+mpi+openmp" \ -&& echo " - gsl" \ -&& echo " - python+pythoncmd" \ -&& echo " - py-pyparsing" \ -&& echo " - py-numpy" \ -&& echo " - py-mpi4py" \ -&& echo " - py-h5py+mpi" \ -&& echo " - py-pytest" \ -&& echo " - ninja" \ -&& echo " concretizer:" \ -&& echo " unify: true" \ -&& echo " view: /opt/view" \ -&& echo " config:" \ -&& echo " install_tree: /opt/software") > /opt/spack-environment/spack.yaml +&& (echo spack: \ +&& echo ' packages:' \ +&& echo ' all:' \ +&& echo ' target:' \ +&& echo ' - x86_64_v2' \ +&& echo ' providers:' \ +&& echo ' mpi:' \ +&& echo ' - mpich' \ +&& echo ' blas:' \ +&& echo ' - openblas' \ +&& echo ' lapack:' \ +&& echo ' - openblas' \ +&& echo ' specs:' \ +&& echo ' - hdf5@1.12.2+hl+mpi~fortran' \ +&& echo ' - mpich@develop~fortran device=ch4 netmod=ofi' \ +&& echo ' - petsc@main~fortran+debug' \ +&& echo ' - fftw+mpi+openmp' \ +&& echo ' - gsl' \ +&& echo ' - python+pythoncmd' \ +&& echo ' - py-pyparsing' \ +&& echo ' - py-numpy' \ +&& echo ' - py-mpi4py' \ +&& echo ' - py-h5py+mpi' \ +&& echo ' - py-pytest' \ +&& echo ' - ninja' \ +&& echo ' concretizer:' \ +&& echo ' unify: true' \ +&& echo ' view: /opt/views/view' \ +&& echo ' config:' \ +&& echo ' install_tree: /opt/software') > /opt/spack-environment/spack.yaml # Find externals RUN spack external find tar @@ -53,24 +53,33 @@ RUN spack external find gettext RUN cd /opt/spack-environment && spack env activate . && spack install --fail-fast && spack gc -y # Strip all the binaries -RUN find -L /opt/view/* -type f -exec readlink -f '{}' \; | \ +RUN find -L /opt/views/view/* -type f -exec readlink -f '{}' \; | \ xargs file -i | \ grep 'charset=binary' | \ grep 'x-executable\|x-archive\|x-sharedlib' | \ - awk -F: '{print $1}' | xargs strip -s + awk -F: '{print $1}' | xargs strip # Modifications to the environment that are necessary to run RUN cd /opt/spack-environment && \ - spack env activate --sh -d . >> /etc/profile.d/z10_spack_environment.sh + spack env activate --sh -d . > activate.sh + # Bare OS image to run the installed executables FROM ubuntu:22.04 COPY --from=builder /opt/spack-environment /opt/spack-environment COPY --from=builder /opt/software /opt/software -COPY --from=builder /opt/._view /opt/._view -COPY --from=builder /opt/view /opt/view -COPY --from=builder /etc/profile.d/z10_spack_environment.sh /etc/profile.d/z10_spack_environment.sh + +# paths.view is a symlink, so copy the parent to avoid dereferencing and duplicating it +COPY --from=builder /opt/views /opt/views + +RUN { \ + echo '#!/bin/sh' \ + && echo '.' /opt/spack-environment/activate.sh \ + && echo 'exec "$@"'; \ + } > /entrypoint.sh \ +&& chmod a+x /entrypoint.sh \ +&& ln -s /opt/views/view /opt/view # Noninteractive install! ENV DEBIAN_FRONTEND=noninteractive \ @@ -82,6 +91,6 @@ ENV DEBIAN_FRONTEND=noninteractive \ RUN apt-get -yqq update && apt-get -yqq upgrade \ && apt-get -yqq install build-essential bash git cmake wget gfortran tar \ && rm -rf /var/lib/apt/lists/* -ENTRYPOINT ["/bin/bash", "--rcfile", "/etc/profile", "-l", "-c", "$*", "--" ] +ENTRYPOINT [ "/entrypoint.sh" ] CMD [ "/bin/bash" ]