Browse Source

Add container scripts.

master
poikilos 2 years ago
parent
commit
0c9015a095
  1. 1
      .gitignore
  2. 257
      containers/lmk.devuan-chimaera.sh
  3. 12
      containers/lmk.devuan-chimaera/Dockerfile
  4. 9
      containers/lmk.devuan-chimaera/build-lmk.sh
  5. 33
      containers/lmk.devuan-chimaera/lmk.rc
  6. 11
      install-minetest-build-deps.sh

1
.gitignore

@ -13,3 +13,4 @@ nohup.out
/webapp/settingtypes-list.txt /webapp/settingtypes-list.txt
err.txt err.txt
*.continuified.tmp *.continuified.tmp
linux-minetest-kit.zip

257
containers/lmk.devuan-chimaera.sh

@ -0,0 +1,257 @@
#!/bin/bash
# See https://nextbreakpoint.com/posts/article-compile-code-with-docker.html
# sudo docker build -t lmk-devuan-chimaera-img dyne/devuan:chimaera
me=lmk.devuan-chimera.sh
docker_path="`sudo command -v docker`"
if [ ! -f "$docker_path" ]; then
cat <<END
This script requires docker. For help, see
<https://github.com/poikilos/linux-preinstall/blob/master/doc/Docker.md>
or Docker's own documentation at
<https://docs.docker.com/engine/install/>.
END
fi
container_name="lmk-devuan-chimaera"
image_name="lmk-devuan-chimaera-img"
source $image_name/project.rc
if [ $? -ne 0 ]; then
exit 1
fi
# sudo docker image inspect $image_name > /dev/null
sudo docker image inspect $image_name --format "* docker is looking for the image..."
# ^ appending ":latest" to the name also works.
# ^ Get matching images as a JSON list (where each has "Id" and other
# metadata).
if [ $? -ne 0 ]; then
if [ ! -d "$local_img_dir" ]; then
echo "Error: \"$local_img_dir\" (local_img_dir for storing $SRC_URL) doesn't exist."
exit 1
fi
if [ ! -f "$container_build_blob" ]; then
echo "* downloading $SRC_URL to $DL_SRC_PATH..."
curl "$SRC_URL" --progress-bar --output "$DL_SRC_PATH"
if [ $? -ne 0 ]; then
exit 1
fi
if [ ! -f "$container_build_blob" ]; then
echo "Error: This script requires \"$container_build_blob\"."
exit 1
fi
else
echo "* using existing \"$container_build_blob\" to build the container image"
fi
move_back="false"
prerelease_path=~/Downloads/minetest.org/insider-prerelease/linux-minetest-kit-220509.zip
if [ ! -f $container_build_blob ]; then
if [ -f "$prerelease_path" ]; then
move_back="true"
echo "mv $prerelease_path $container_build_blob"
mv $prerelease_path $container_build_blob
if [ $? -ne 0 ]; then
echo "* Error: the mv command failed."
exit 1
fi
fi
fi
sudo docker build -t $image_name $local_img_dir
code=$?
if [ "@move_back" = "@true" ]; then
echo "mv \"$prerelease_path\" \"$container_build_blob\""
mv "$container_build_blob" "$prerelease_path"
if [ $? -ne 0 ]; then
echo "* Warning: the mv command failed."
fi
fi
if [ $code -ne 0 ]; then
exit 1
fi
else
echo "* The container will be built using the existing docker image $image_name"
fi
cat <<END
How to use the image:
# docker options:
# -i: is interactive (attach STDIN).
# -d: is daemon mode.
sudo docker image ls
# ^ See what images are installed (one image can be used for many containers).
sudo docker rmi $image_name
# ^ Remove a docker image (This is necessary after updating the unversioned Docker image to avoid cached RUN commands from doing nothing when the script after RUN changes).
sudo docker image prune
# ^ Prune unused images (For this to do anything, first delete containers using the image).
sudo docker ps -a
# ^ List containers and show NAMES (The name is necessary for certain subcommands such as exec which operate on a running container).
sudo docker start $container_name
# ^ Start a container.
sudo docker run $container_name
# ^ "run" is merely a combination of "create" and "start"
sudo docker -w $contained_repo exec $container_name ls -l $contained_repos
# ^ Execute a command in a running container (exec shows an error if the container isn't running).
# This will not work if the run/start command that started the container isn't a command that keeps it open (runs indefinitely)!
# w: working directory
sudo docker stop $container_name
# ^ Stop a container by name (See <https://www.tecmint.com/name-docker-containers/>)
# You must use the container name (as determined using the "ps" subcommand), not the image name.
sudo docker container run -it $image_name /bin/bash
# ^ Run an interactive terminal (Type 'exit' to exit)
# (based on <https://phoenixnap.com/kb/docker-run-command-with-examples>)
sudo docker attach $container_name
# ^ Attach your current terminal to a running container (See
# <https://docs.docker.com/engine/reference/commandline/attach/>).
sudo docker rm --force $container_name
# ^ Delete a container by its name.
# --force: kill and delete running containers as well.
END
# sudo docker container run -d --name $image_name unzip xvf $contained_arc -C $contained_repos
container_Id=`sudo docker ps -aqf "name=$container_name"`
# ^ ONLY works with container_name not image_name
cat > /dev/null <<END
if [ "@$container_Id" = "@" ]; then
echo "* creating a container named $container_name"
sudo docker create --name=$container_name $image_name
# ^ output is the Id
if [ $? -ne 0 ]; then
echo "FAILED"
exit 1
fi
container_Id=`sudo docker ps -aqf "name=$container_name"`
if [ -z "$container_Id" ]; then
echo "The container_Id couldn't be obtained from sudo docker ps -aqf \"name=$container_name\", so creating the named image failed."
exit 1
fi
fi
echo "container_Id=$container_Id"
END
printf "starting the docker image..."
# sudo docker start $container_name
# ^ NOTE: start is useless here since it won't stay open unless the
# command is set to "bash" or something, which isn't desirable.
# Therefore, use run instead of exec below.
# ^ output is $container_name
sudo docker run --name $container_name $image_name /opt/build-lmk.sh
if [ $? -ne 0 ]; then
echo "FAILED"
exit 1
else
echo "OK"
fi
# ^ NOTE: start is useless here since it won't stay open unless the
# command is set to "bash" or something, which isn't desirable.
# Therefore, use run instead of exec below.
if [ "@$contained_repo" = "@" ]; then
echo "Error: contained_repo can't be blank or checking for its files in the container won't work."
exit 1
fi
contained_good_repo_flag_path="$contained_repo/$good_repo_flag_name"
# sudo docker exec $container_name ls $contained_repo
echo "* checking for $contained_good_repo_flag_path on the destination..."
sudo docker exec $container_name ls $contained_good_repo_flag_path > /dev/null
if [ $? -ne 0 ]; then
printf "NO...checking for unzip..."
container_unzip="`sudo docker exec $container_name which unzip`"
if [ "@$container_unzip" = "@" ]; then
echo "NO. Installing..."
# This should never happen if the Dockerfile was used.
sudo docker exec $container_name apt-get update
if [ $? -ne 0 ]; then exit 1; fi
sudo docker exec $container_name apt-get install -y unzip
if [ $? -ne 0 ]; then exit 1; fi
container_unzip="`sudo docker exec $container_name which unzip`"
if [ "@$container_unzip" = "@" ]; then
echo "Error: Installing unzip in the container did not succeed. Install unzip inside the container manually then try again, or extract linux-minetest-kit such that $contained_good_repo_flag_path exists."
exit 1
fi
else
echo "FOUND"
fi
# sudo docker container run $image_name unzip xvf $contained_arc -d $contained_repos
echo "* extracting $contained_arc"
sudo docker exec $container_name unzip $contained_arc -d $contained_repos
# -d: is destination, like -C or --directory for tar.
# -v: verbose (prevents extraction)
if [ $? -ne 0 ]; then
echo "Error: unzip failed within the container. Install unzip inside the container manually then try again, or extract linux-minetest-kit such that $contained_good_repo_flag_path exists."
exit 1
fi
else
echo "FOUND (already extracted)"
fi
# sudo docker exec $container_name ls $contained_repo > /dev/null
sudo docker exec $container_name ls $contained_good_repo_flag_path > /dev/null
if [ $? -ne 0 ]; then
echo "Error: extracting linux-minetest-kit.zip in the container didn't work. Extract linux-minetest-kit.zip to $contained_repos such that $contained_good_repo_flag_path exists in the container and try again."
exit 1
else
echo "* detected $contained_good_repo_flag_path (So the source directory is assumed to be ok)"
fi
if [ "@$contained_user" = "@" ]; then
echo "Error: contained_user can't be blank, or checking for the user within the container will not work."
exit 1
fi
sudo docker exec $container_name id -u $contained_user
if [ $? -ne 0 ]; then
printf "* creating $contained_user in container $container_name..."
sudo docker exec $container_name adduser --disabled-password --gecos "" $contained_user --home $contained_home
if [ $? -ne 0 ]; then
echo "FAILED"
exit 1
else
echo "OK"
fi
else
echo "* using the $container_name container's existing contained_user: $contained_user"
fi
# sudo docker container run --name $container_name $image_name ls $contained_repos
# sudo docker exec $container_name chown -R $contained_user $contained_repos
# ^ Usually you could do this, but run as root since this script is used to test the safety of linux-minetest-kit:
# sudo docker exec $container_name curl https://raw.githubusercontent.com/poikilos/EnlivenMinetest/master/install-minetest-build-deps.sh --output /opt/install-minetest-build-deps.sh
# sudo docker exec $container_name chmod +x $repo_build_assumptions_cmd
# sudo docker exec $container_name $repo_build_assumptions_cmd
# ^ moved to Dockerfile
echo "* building libraries using $repo_build_libs_cmd..."
sudo docker exec -w $contained_src $container_name $repo_build_libs_cmd
if [ $? -ne 0 ]; then exit 1; fi
# echo "* building program using $repo_build_cmd..."
# sudo docker exec -w $contained_src $container_name $repo_build_cmd
if [ $? -ne 0 ]; then exit 1; fi
# -w: working directory
# How to use docker-compose (See <https://docs.docker.com/compose/>):
# "1. Define your app’s environment with a Dockerfile so it can be reproduced anywhere."
# "2. Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment."
# "3. Run docker compose up and the Docker compose command starts and runs your entire app. You can alternatively run docker-compose up using the docker-compose binary."

12
containers/lmk.devuan-chimaera/Dockerfile

@ -0,0 +1,12 @@
FROM dyne/devuan:chimaera
# An absolute path for COPY doesn't work ('/' is removed from the beginning).
COPY linux-minetest-kit.zip /opt
COPY lmk.rc /opt
COPY build-lmk.sh /opt
RUN apt-get update
RUN apt-get install -y unzip
RUN unzip /opt/linux-minetest-kit.zip -d /opt
# RUN apt-get install -y sudo
RUN curl https://raw.githubusercontent.com/poikilos/EnlivenMinetest/master/install-minetest-build-deps.sh --output /opt/install-minetest-build-deps.sh
RUN chmod +x /opt/install-minetest-build-deps.sh
RUN /opt/install-minetest-build-deps.sh

9
containers/lmk.devuan-chimaera/build-lmk.sh

@ -0,0 +1,9 @@
#!/bin/bash
cd /opt
if [ $? -ne 0 ]; then
exit 1
fi
source lmk.rc
if [ $? -ne 0 ]; then
exit 1
fi

33
containers/lmk.devuan-chimaera/lmk.rc

@ -0,0 +1,33 @@
contained_repos=/opt
contained_arc="$contained_repos/linux-minetest-kit.zip"
# ^ This must always be in sync with "COPY linux-minetest-kit.zip /opt" in Dockerfile
contained_repo=$contained_repos/linux-minetest-kit
contained_user=minebest
contained_home=/home/$contained_user
if [ "@$SRC_URL" = "@" ]; then
SRC_URL="https://downloads.minetest.org/linux-minetest-kit.zip"
fi
#if [ "@$DL_SRC_NAME" = "@" ]; then
DL_SRC_NAME=linux-minetest-kit.zip
#fi
local_img_dir="lmk.devuan-chimaera"
if [ ! -d "$local_img_dir" ]; then
echo "* $me must run from the directory containing the container image directory: $local_img_dir"
exit 1
fi
container_build_blob=$local_img_dir/linux-minetest-kit.zip
# ^ local_img_dir has to be in the same directory as Dockerfile or
# the COPY command in the Dockerfile won't work.
if [ "@$DL_SRC_PATH" = "@" ]; then
# DL_SRC_PATH="$HOME/Downloads/$DL_SRC_NAME"
DL_SRC_PATH="$local_img_dir"
# ^ $DL_SRC_PATH has to be in the same directory as Dockerfile or
# the COPY command in the Dockerfile won't work.
# The file should be added to .gitignore for the reason that it
# is in the repo in the docker image directory.
fi
good_repo_flag_name="mtcompile-program.pl"
repo_build_assumptions_cmd="/opt/install-minetest-build-deps.sh"
repo_build_libs_cmd="./mtcompile-libraries.sh"
repo_build_cmd="./mtcompile-program.pl --build --classic --client"

11
install-minetest-build-deps.sh

@ -2,9 +2,18 @@
# Do not use sudo, in case sudo is not installed (such as in some # Do not use sudo, in case sudo is not installed (such as in some
# default installations including the dyne/devuan:chimaera docker image # default installations including the dyne/devuan:chimaera docker image
# on docker hub. # on docker hub.
customExit(){
>&2 echo "Error:"
echo "$1"
code=1
if [ "@$2" -ne "@" ]; then
code=$2
fi
exit $code
}
me=install-minetest-build-deps.sh me=install-minetest-build-deps.sh
if [ "$EUID" -ne 0 ]; then if [ "$EUID" -ne 0 ]; then
echo "Error: $me must run as root." >&2 echo "Error: $me must run as root."
exit 1 exit 1
fi fi
enable_postgres="false" enable_postgres="false"

Loading…
Cancel
Save