From bdd5aab8be37d53090190ae1d4f12f49d09e0fb3 Mon Sep 17 00:00:00 2001 From: Patrick Gartung Date: Tue, 26 Jun 2018 03:10:13 -0500 Subject: Add Dockerfile for Scientific Linux 7 (RHEL7 recompile) (#8422) * Add Dockerfile for Scientific Linux 7 (RHEL7 recompile) --- share/spack/docker/docker-compose.yml | 6 + share/spack/docker/spack_scilinux/Dockerfile | 62 +++++++++ share/spack/docker/spack_scilinux/handle-prompt.sh | 143 +++++++++++++++++++++ share/spack/docker/spack_scilinux/handle-ssh.sh | 36 ++++++ share/spack/docker/spack_scilinux/modules.yaml | 6 + 5 files changed, 253 insertions(+) create mode 100644 share/spack/docker/spack_scilinux/Dockerfile create mode 100644 share/spack/docker/spack_scilinux/handle-prompt.sh create mode 100644 share/spack/docker/spack_scilinux/handle-ssh.sh create mode 100644 share/spack/docker/spack_scilinux/modules.yaml (limited to 'share') diff --git a/share/spack/docker/docker-compose.yml b/share/spack/docker/docker-compose.yml index f050a86700..380ebfc425 100644 --- a/share/spack/docker/docker-compose.yml +++ b/share/spack/docker/docker-compose.yml @@ -24,6 +24,12 @@ services: - '../../..:/spack' environment: PROMPT: "${PROMPT:-0}" + scilinux: + build: ./spack_scilinux + volumes: + - '../../..:/spack' + environment: + PROMPT: "${PROMPT:-0}" ubuntu: build: ./spack_ubuntu volumes: diff --git a/share/spack/docker/spack_scilinux/Dockerfile b/share/spack/docker/spack_scilinux/Dockerfile new file mode 100644 index 0000000000..dd066d7a82 --- /dev/null +++ b/share/spack/docker/spack_scilinux/Dockerfile @@ -0,0 +1,62 @@ +FROM sl:7 +MAINTAINER Patrick Gartung (gartung@fnal.gov) + +ENV SPACK_ROOT=/spack \ + FORCE_UNSAFE_CONFIGURE=1 \ + DISTRO=rhel7 \ + container=docker + +RUN yum update -y && \ + yum install -y yum-conf-repos.noarch && \ + yum update -y && \ + yum -y install epel-release && \ + yum update -y && \ + yum --enablerepo epel \ + groupinstall -y "Development Tools" && \ + yum --enablerepo epel \ + install -y \ + curl \ + findutils \ + gcc-c++ \ + gcc \ + gcc-gfortran \ + git \ + gnupg2 \ + hostname \ + iproute \ + Lmod \ + make \ + patch \ + openssh-server \ + python \ + tcl +RUN git clone --depth=1 git://github.com/spack/spack.git /spack && \ + rm -rf /var/cache/yum /spack/.git && yum clean all + +RUN echo "source /usr/share/lmod/lmod/init/bash" \ + > /etc/profile.d/spack.sh +RUN echo "source /spack/share/spack/setup-env.sh" \ + >> /etc/profile.d/spack.sh +RUN echo "source /spack/share/spack/spack-completion.bash" \ + >> /etc/profile.d/spack.sh +COPY handle-ssh.sh /etc/profile.d/handle-ssh.sh +COPY handle-prompt.sh /etc/profile.d/handle-prompt.sh.source + +RUN ( \ + echo "export DISTRO=$DISTRO" ; \ + echo "if [ x\$PROMPT '!=' 'x' -a x\$PROMPT '!=' 'x0' ]" ; \ + echo "then" ; \ + echo "source /etc/profile.d/handle-prompt.sh.source" ; \ + echo "fi" ; \ +) > /etc/profile.d/handle-prompt.sh + +RUN mkdir -p /root/.spack +COPY modules.yaml /root/.spack/modules.yaml + +RUN rm -f /run/nologin + +RUN rm -rf /root/*.* + +WORKDIR /root +ENTRYPOINT ["bash"] +CMD ["-l"] diff --git a/share/spack/docker/spack_scilinux/handle-prompt.sh b/share/spack/docker/spack_scilinux/handle-prompt.sh new file mode 100644 index 0000000000..15ef53e316 --- /dev/null +++ b/share/spack/docker/spack_scilinux/handle-prompt.sh @@ -0,0 +1,143 @@ +__tmp="`mktemp -d`" + +__trylock() { + local dir + dir="$__tmp/$1.lock" + mkdir "$dir" &>/dev/null + return $? +} + +__queue_init() { + local r + local w + + mkdir "$__tmp/$1.read.lock" ; r=$? + mkdir "$__tmp/$1.write.lock" ; w=$? + + if [ "$r" '=' '0' -a "$w" '=' '0' ] ; then + return 0 + else + return 1 + fi +} + +__queue_try_read() { + __trylock "$1.read" + return $? +} + +__queue_try_write() { + __trylock "$1.write" + return $? +} + +__queue_make_readable() { + rm -r "$__tmp/$1.read.lock" &>/dev/null + return $? +} + +__queue_make_writable() { + rm -r "$__tmp/$1.write.lock" &>/dev/null + return $? +} + +__read() { + cat "$__tmp/$1" 2> /dev/null + return $? +} + +__write() { + cat > "$__tmp/$1" 2> /dev/null + return $? +} + +__update_prompt() { + local prompt + prompt='' + linux_distro="$DISTRO" + if [ -n "$linux_distro" ] ; then + linux_distro='\[\e[1;34m\][\[\e[0;34m\]'"$linux_distro"'\[\e[1;34m\]]' + if [ -n "$prompt" ] ; then + prompt="$prompt " + fi + prompt="$prompt$linux_distro" + fi + + git_head="`git --git-dir=/spack/.git --work-tree=/spack rev-parse --abbrev-ref HEAD 2>/dev/null`" + if [ "$?" '=' '0' ] ; then + if [ "$git_head" '=' 'HEAD' ] ; then + git_head="`git --git-dir=/spack/.git --work-tree=/spack rev-parse HEAD 2>/dev/null | cut -c1-8`..." + fi + else + git_head='' + fi + + if [ -n "$git_head" ] ; then + git_head='\[\e[1;32m\](\[\e[0;32m\]'"$git_head"'\[\e[1;32m\])' + if [ -n "$prompt" ] ; then + prompt="$prompt " + fi + prompt="$prompt$git_head" + fi + + if [ -n "$prompt" ] ; then + prompt="$prompt " + fi + prompt="$prompt"'\[\e[0;m\]\W: ' + echo "$prompt" | __write prompt +} + +set -m +( + __queue_init query + __queue_init prompt + + __update_prompt + __queue_make_readable prompt + + __queue_make_writable query + + while sleep 0.010 ; do + last_q_time='' + + while sleep 0.010 ; do + q_time="`date +%s%N`" + if __queue_try_read query ; then + last_q_time="$q_time" + __queue_make_writable query + fi + + if [ -n "$last_q_time" -a \ + "$(( (q_time - last_q_time)/10000000 > 100 ))" '=' '1' ] ; then + break + fi + done + + __update_prompt + __queue_make_readable prompt + done +) &>/dev/null & +set +m + +__update_prompt_main_first_call=1 +__update_prompt_main() { + if [ "$__update_prompt_main_first_call" '=' '1' ] ; then + while sleep 0.001 ; do + if __queue_try_read prompt ; then + PS1="`__read prompt`" + break + fi + done + __update_prompt_main_first_call=0 + else + if __queue_try_read prompt ; then + PS1="`__read prompt`" + fi + fi + + if __queue_try_write query ; then + __queue_make_readable query + fi +} + +PROMPT_COMMAND=__update_prompt_main diff --git a/share/spack/docker/spack_scilinux/handle-ssh.sh b/share/spack/docker/spack_scilinux/handle-ssh.sh new file mode 100644 index 0000000000..f13c10e212 --- /dev/null +++ b/share/spack/docker/spack_scilinux/handle-ssh.sh @@ -0,0 +1,36 @@ +uid="`id -u`" +if [ "$uid" '=' '0' ] ; then + for key_type in dsa ecdsa ed25519 rsa ; do + private_key_file="/etc/ssh/ssh_host_${key_type}_key" + public_key_file="$private_key_file.pub" + + if [ '!' -f "$private_key_file" ] ; then + ssh-keygen \ + -q -t "$key_type" -N "" -f "$private_key_file" + chmod 600 "$private_key_file" + chmod 644 "$public_key_file" + fi + done + + mkdir -p /var/run/sshd + + pgrep -u 0 -U 0 sshd &> /dev/null + if [ '!' "$?" '=' '0' ] ; then + nohup /usr/sbin/sshd -f /etc/ssh/sshd_config < /dev/null &> /dev/null + fi +fi + +if [ '!' -f "$HOME/.ssh/id_rsa" ] ; then + ssh-keygen \ + -t rsa -C "spack.developer@docker.host" -N "" -f "$HOME/.ssh/id_rsa" + cat "$HOME/.ssh/id_rsa.pub" >> "$HOME/.ssh/authorized_keys" + chmod 600 "$HOME/.ssh/authorized_keys" + + docker_ip="`ip address show dev eth0 | + grep inet | + cut -d' ' -f 6 | + cut -d/ -f 1`" + + ssh-keyscan -t rsa 127.0.0.1 localhost "$docker_ip" "`hostname`" \ + > "$HOME/.ssh/known_hosts" 2> /dev/null +fi diff --git a/share/spack/docker/spack_scilinux/modules.yaml b/share/spack/docker/spack_scilinux/modules.yaml new file mode 100644 index 0000000000..02907ecc40 --- /dev/null +++ b/share/spack/docker/spack_scilinux/modules.yaml @@ -0,0 +1,6 @@ +modules: + enable: + - lmod + lmod: + core_compilers: + - gcc -- cgit v1.2.3-60-g2f50