CMSC417 Spring 2023 Docker Setup Script
The snippet can be accessed without any authentication.
Authored by
David Dongwook Kim
Edited
417docker.sh 4.34 KiB
#!/bin/bash
if [ `id -u` -eq 0 ]; then
echo "Do not run this script as root. This is necessary to detect your uid/gid. `sudo` is prepended to Docker commands already."
exit 1
fi
if [ `uname -s` = "Linux" ]
then
uid=`id -u`
gid=`id -g`
elif [ `uname -s` = "Darwin" ]
then
uid=1000
gid=1000
else
echo "Are you using BSD, Solaris, or some other bizarro UNIX? Please email the TAs, we're curious."
exit 1
fi
scriptDir="$(pwd)"
dockerfilePath="."
imageName="cmsc417spr23image"
imageTag="latest"
container="cmsc417container"
vscode=0
mkdir -p CMSC417
touch CMSC417/.bashrc
wd="$(pwd)/CMSC417"
while getopts 'v' flag; do
case "${flag}" in
v) vscode=1 ;;
*) error "Unexpected option ${flag}" ;;
esac
done
if [ $vscode -eq 1 ]
then
mkdir -p .devcontainer
cd .devcontainer
cat >devcontainer.json <<EOL
{
"name": "cmsc417container",
"image": "$imageName:$imageTag",
"workspaceFolder": "/home/student",
"workspaceMount": "source=$scriptDir/CMSC417,target=/home/student,type=bind",
"customizations": {
"vscode": {
"settings": {
"terminal.integrated.defaultProfile.linux": "bash",
"editor.tabSize": 4
},
"extensions": [
"jeff-hykin.better-cpp-syntax",
"ms-vscode.cpptools",
"ms-vscode.cpptools-extension-pack",
"ms-vscode.cpptools-themes",
"eamodio.gitlens",
"aaron-bond.better-comments"
]
}
},
"runArgs": ["--name", "cmsc417container"]
}
EOL
cd ..
fi
cat >Dockerfile <<EOL
FROM debian:10
LABEL description="CMSC417 Docker Image"
ENV TZ="America/New_York"
RUN apt-get -yq update && \
apt-get -yq upgrade && \
apt-get -yq install \
git \
make \
gcc \
g++ \
emacs-nox \
vim \
sudo \
libssl-dev \
libncurses-dev \
libev-dev \
cmake \
protobuf-compiler \
htop \
curl \
bison \
flex \
build-essential \
valgrind && \
ln -fs /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN groupadd -g $gid student && \
useradd -r -u $uid -g student student && \
usermod --shell /bin/bash student && \
echo 'student ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers && \
mkdir /home/student && \
chown student:student /home/student
USER student:student
RUN id -u -n && \
cd && curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
EOL
if [ "$(sudo docker image inspect $imageName:$imageTag 2> /dev/null)" = "[]" ]; then
echo "CMSC417 docker image does not exist, building it"
sudo docker build -t $imageName:$imageTag .
if [ "$(sudo docker image inspect $imageName:$imageTag 2> /dev/null)" = "[]" ]; then
echo "Build failed"
exit -1
fi
fi
if [ $vscode -eq 1 ]
then
echo "If not already done, open this directory $(pwd) in your VSCode - just as with \`code $(pwd)\` It should prompt you to open a docker container."
echo "If not, you should install https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers"
echo "Optionally, you can install https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker"
echo
echo "It may be beneficial to append the following lines to your VSCode User Setttings"
echo "\"remote.containers.defaultExtensions\": ["
echo " \"ms-vscode.cpptools\","
echo " \"ms-vscode.cpptools-extension-pack\","
echo " \"jeff-hykin.better-cpp-syntax\","
echo " \"aaron-bond.better-comments\""
echo "],"
echo "\"terminal.integrated.defaultProfile.linux\": \"bash\""
exit 0
fi
if [ "$(sudo docker container inspect $container 2> /dev/null)" = "[]" ]; then
echo "Container does not exist, creating it"
sudo docker create --name=cmsc417container -v "$wd":/home/student -ti $imageName:$imageTag
if [ "$(sudo docker container inspect $container 2> /dev/null)" = "[]" ]; then
echo "Could not create container"
exit 1
fi
fi
if [ "$(sudo docker container inspect $container -f '{{.State.Status}}' 2> /dev/null)" != "running" ]; then
echo "Container not running, starting it"
sudo docker start cmsc417container
if [ "$(sudo docker container inspect $container -f '{{.State.Status}}' 2> /dev/null)" != "running" ]; then
echo "Could not start container"
exit 2
fi
fi
sudo docker exec -u $uid -it $container /bin/bash -c 'cd; bash'
Please register or sign in to comment