Set UIDs properly on run; fix sudo use

This depends on a new entrypoint put inside the docker image, that will
read BUILDER_UID and fix up the users and files.

This also removes "sudo" and allows the entire script to be run with
sudo without messing with the build file permissions.
develop
Kelvie Wong 2023-01-15 20:34:52 -08:00
parent aaaf2d9f22
commit 5a20f775bf
2 changed files with 29 additions and 14 deletions

@ -1,5 +1,6 @@
#!/usr/bin/env sh
#!/bin/bash
set -e
# Number of jobs == core count
jobs=$(grep -c ^processor /proc/cpuinfo)
@ -8,20 +9,36 @@ srcdir=$(realpath "$(dirname "$(readlink -f "$0")")"/..)
cd "$srcdir"/build
builder_uid=$(id -u)
mkdir -p win64-cross
mkdir -p win64-cross/output
# Check for sudo; we want to use the real user
if [[ $(id -u) -eq 0 ]]; then
if [[ -z "$SUDO_UID" || "$SUDO_UID" -eq 0 ]]; then
echo "Please don't run this script directly as root, use sudo instead:"
echo
echo " sudo $0"
# This is because we can't change the buildmaster UID in the container to 0 --
# that's already taken by root.
exit 1
fi
# If this was run using sudo, let's make sure the directories are owned by the
# real user (and set the BUILDER_UID to it)
builder_uid=$SUDO_UID
chown $builder_uid win64-cross win64-cross/output
fi
# Assumes you built a container image called dfhack-build-msvc from
# https://github.com/BenLubar/build-env/tree/master/msvc, see
# docs/dev/compile/Compile.rst.
#
# NOTE: win64-cross is mounted in /src/build due to the hardcoded `cmake ..` in
# the Dockerfile
#
# TODO: make this work for rootless docker, i.e. remove the sudo for those that
# don't normally need to use sudo to run docker.
if ! sudo docker run --rm -it -v "$srcdir":/src -v "$srcdir/build/win64-cross/":/src/build \
--user buildmaster \
if ! docker run --rm -it -v "$srcdir":/src -v "$srcdir/build/win64-cross/":/src/build \
-e BUILDER_UID=$builder_uid \
--name dfhack-win \
dfhack-build-msvc bash -c "cd /src/build && dfhack-configure windows 64 Release -DCMAKE_INSTALL_PREFIX=/src/build/output && dfhack-make -j$jobs install" \
; then

@ -387,10 +387,7 @@ It'll be called ``dfhack-build-msvc:latest`` after it's done building::
git clone https://github.com/BenLubar/build-env.git
cd build-env/msvc
docker build --build-arg BUILDER_UID=$(id -u) -t dfhack-build-msvc .
The ``BUILDER_UID`` argument is used to make sure the build user can access your
source code directory inside the container.
docker build -t dfhack-build-msvc .
The docker build takes a while, but only needs to be done once, unless the build
environment changes.
@ -406,14 +403,15 @@ Check out ``dfhack`` into another directory, and run the build script::
cd build
./build-win64-from-linux.sh
The last step may ask you for your ``sudo`` password -- if you are able to run
``docker`` without ``sudo`` normally, you can remove the ``sudo`` from the build
script.
The script will mount your host's ``dfhack`` directory to docker, use it to
build the artifacts in ``build/win64-cross``, and put all the files needed to
install in ``build/win64-cross/output``.
If you need to run ``docker`` using ``sudo``, run the script using ``sudo``
rather than directly::
sudo ./build-win64-from-linux.sh
Step 3: install dfhack to your Steam DF install
-----------------------------------------------
As the script will tell you, you can then copy the files into your DF folder::