fd697274a3
When used as PID 1, /bin/sh takes 3248 kB compared to the 4136 kB taken by /bin/bash. It's not a lot, but is memory that can be saved for free. As a nice side-effect, this unbreaks 'create' with podman-0.9.1 because 'podman create ...' doesn't work without a command. https://github.com/containers/libpod/issues/1452
189 lines
5.7 KiB
Bash
Executable file
189 lines
5.7 KiB
Bash
Executable file
#!/bin/sh
|
|
#
|
|
# Copyright © 2018 Red Hat, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
|
|
|
|
source /etc/os-release
|
|
|
|
toolbox_container="fedora-toolbox-$USER:$VERSION_ID"
|
|
toolbox_prompt="🔹[\u@\h \W]\\$ "
|
|
|
|
base_toolbox_image="fedora-toolbox:$VERSION_ID"
|
|
toolbox_image="fedora-toolbox-$USER:$VERSION_ID"
|
|
working_container_name="fedora-toolbox-$USER-working-container"
|
|
|
|
|
|
create()
|
|
{
|
|
if ! buildah images --noheading | grep --quiet $toolbox_image; then
|
|
if ! buildah from --name $working_container_name $base_toolbox_image >/dev/null 2>&1; then
|
|
echo "$0: failed to create working container"
|
|
exit 1
|
|
fi
|
|
|
|
if ! buildah containers --noheading | grep --quiet $working_container_name; then
|
|
echo "$0: failed to create working container"
|
|
exit 1
|
|
fi
|
|
|
|
if ! buildah run $working_container_name -- useradd \
|
|
--no-create-home \
|
|
--uid $UID \
|
|
--groups wheel \
|
|
$USER \
|
|
>/dev/null 2>&42; then
|
|
buildah rmi $working_container_name >/dev/null 2>&42
|
|
echo "$0: failed to create user $USER with UID $UID"
|
|
exit 1
|
|
fi
|
|
|
|
if ! buildah run $working_container_name -- passwd -d $USER >/dev/null 2>&42; then
|
|
buildah rmi $working_container_name >/dev/null 2>&42
|
|
echo "$0: failed to remove password for user $USER"
|
|
exit 1
|
|
fi
|
|
|
|
if ! buildah config --volume $HOME $working_container_name >/dev/null 2>&42; then
|
|
buildah rmi $working_container_name >/dev/null 2>&42
|
|
echo "$0: failed to configure volume for $HOME"
|
|
exit 1
|
|
fi
|
|
|
|
if ! buildah config --volume $XDG_RUNTIME_DIR $working_container_name >/dev/null 2>&42; then
|
|
buildah rmi $working_container_name >/dev/null 2>&42
|
|
echo "$0: failed to configure volume for /run/user/$UID"
|
|
exit 1
|
|
fi
|
|
|
|
if ! buildah config --user $USER $working_container_name >/dev/null 2>&42; then
|
|
buildah rmi $working_container_name >/dev/null 2>&42
|
|
echo "$0: failed to configure the default user as $USER"
|
|
exit 1
|
|
fi
|
|
|
|
if ! buildah config --workingdir $HOME $working_container_name >/dev/null 2>&42; then
|
|
buildah rmi $working_container_name >/dev/null 2>&42
|
|
echo "$0: failed to configure the initial working directory to $HOME"
|
|
exit 1
|
|
fi
|
|
|
|
if ! buildah commit --rm $working_container_name $toolbox_image >/dev/null 2>&42; then
|
|
buildah rmi $working_container_name >/dev/null 2>&42
|
|
echo "$0: failed to create image $toolbox_image"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
if ! podman create \
|
|
--hostname toolbox \
|
|
--interactive \
|
|
--name $toolbox_container \
|
|
--network host \
|
|
--privileged \
|
|
--security-opt label=disable \
|
|
--tty \
|
|
--volume $HOME:$HOME \
|
|
--volume $XDG_RUNTIME_DIR:$XDG_RUNTIME_DIR \
|
|
$toolbox_image \
|
|
/bin/sh >/dev/null 2>&42; then
|
|
echo "$0: failed to create container $toolbox_container"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
|
|
enter()
|
|
{
|
|
if ! podman start $toolbox_container >/dev/null 2>&42; then
|
|
echo "$0: failed to start container $toolbox_container"
|
|
exit 1
|
|
fi
|
|
|
|
podman exec \
|
|
--env COLORTERM=$COLORTERM \
|
|
--env DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS \
|
|
--env DESKTOP_SESSION=$DESKTOP_SESSION \
|
|
--env DISPLAY=$DISPLAY \
|
|
--env LANG=$LANG \
|
|
--env PS1="$toolbox_prompt" \
|
|
--env SHELL=$SHELL \
|
|
--env SSH_AUTH_SOCK=$SSH_AUTH_SOCK \
|
|
--env TERM=$TERM \
|
|
--env VTE_VERSION=$VTE_VERSION \
|
|
--env XDG_CURRENT_DESKTOP=$XDG_CURRENT_DESKTOP \
|
|
--env XDG_DATA_DIRS=$XDG_DATA_DIRS \
|
|
--env XDG_MENU_PREFIX=$XDG_MENU_PREFIX \
|
|
--env XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR \
|
|
--env XDG_SEAT=$XDG_SEAT \
|
|
--env XDG_SESSION_DESKTOP=$XDG_SESSION_DESKTOP \
|
|
--env XDG_SESSION_ID=$XDG_SESSION_ID \
|
|
--env XDG_SESSION_TYPE=$XDG_SESSION_TYPE \
|
|
--env XDG_VTNR=$XDG_VTNR \
|
|
--interactive \
|
|
--tty \
|
|
$toolbox_container \
|
|
$SHELL -l 2>&42
|
|
}
|
|
|
|
|
|
usage()
|
|
{
|
|
echo "Usage: $0 [-v | --verbose ] create"
|
|
echo " or: $0 [-v | --verbose ] enter"
|
|
echo " or: $0 --help"
|
|
}
|
|
|
|
|
|
exec 42>/dev/null
|
|
|
|
while [[ "$1" == -* ]]; do
|
|
case $1 in
|
|
-h | --help )
|
|
usage
|
|
exit
|
|
;;
|
|
-v | --verbose )
|
|
exec 42>&2
|
|
;;
|
|
* )
|
|
echo "$0: unrecognized option '$1'"
|
|
echo "Try '$0 --help' for more information."
|
|
exit 1
|
|
esac
|
|
shift
|
|
done
|
|
|
|
if [ "$1" == "" ]; then
|
|
echo "$0: missing command"
|
|
echo "Try '$0 --help' for more information."
|
|
exit 1
|
|
fi
|
|
|
|
op=$1
|
|
case $op in
|
|
create )
|
|
create
|
|
exit
|
|
;;
|
|
enter )
|
|
enter
|
|
exit
|
|
;;
|
|
* )
|
|
echo "$0: unrecognized command '$1'"
|
|
echo "Try '$0 --help' for more information."
|
|
exit 1
|
|
esac
|