poikilos
3 years ago
6 changed files with 322 additions and 1 deletions
@ -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." |
@ -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 |
@ -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 |
@ -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" |
Loading…
Reference in new issue