Added support for Podman (#2)

* Changed to Podman

* added option to use podman or docker on host

* Feature/podman fix (#1)

* WIP

* WIP

* restored dockerfile

* podman works rootless savepoint

* added bin folder

* changed teams-two to podman

* changed to podman scheme

* updated Makefile

* updated README.md

* host script refactor

* renamed Dockerfile to Containerfile for podman scheme

* added ci

* changed ci script name

* tried changing repo name

* prepared merge with main. Added config to swap container runtime with ease
This commit is contained in:
ChristofferNissen
2022-01-23 14:41:05 +01:00
committed by GitHub
parent 16a77bdf18
commit 589d2c5263
10 changed files with 187 additions and 83 deletions

1
.env Normal file
View File

@@ -0,0 +1 @@
CONTAINER_ENGINE=docker

42
.github/workflows/container-build.yml vendored Normal file
View File

@@ -0,0 +1,42 @@
name: Build teams container
on:
- push
jobs:
build:
name: Build image
runs-on: ubuntu-latest
env:
IMAGE_NAME: teams-desktop
REGISTRY: ghcr.io/christoffernissen
steps:
- name: Clone the repository
uses: actions/checkout@v2
- name: Buildah Action
id: build-image
uses: redhat-actions/buildah-build@v2
with:
image: ${{ env.IMAGE_NAME }}
tags: latest ${{ github.sha }}
containerfiles: |
./Containerfile
- name: Log in to the GitHub Container registry
uses: redhat-actions/podman-login@v1
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Push to GitHub Container Repository
id: push-to-ghcr
uses: redhat-actions/push-to-registry@v2
with:
image: ${{ steps.build-image.outputs.image }}
tags: ${{ steps.build-image.outputs.tags }}
registry: ${{ env.REGISTRY }}
- name: Print image URL
run: echo "Image pushed to ${{ steps.push-to-ghcr.outputs.registry-paths }}"

1
.gitigore Normal file
View File

@@ -0,0 +1 @@
bin/

View File

@@ -1,26 +1,35 @@
include .env
launch: launch:
teams-wrapper teams teams-wrapper teams
teams-wrapper-two teams teams-wrapper-two teams
kill-containers: kill-containers:
docker kill teams || docker kill teams-two # if error try kill other instance before exit ${CONTAINER_ENGINE} kill teams || podman kill teams-two # if error try kill other instance before exit
docker kill teams-two ${CONTAINER_ENGINE} kill teams-two
build: build:
docker build . -t stifstof/teams-desktop:latest ${CONTAINER_ENGINE} build -t docker.io/stifstof/teams-desktop:latest -f Containerfile .
build-no-cache:
${CONTAINER_ENGINE} build --no-cache -t docker.io/stifstof/teams-desktop:latest -f Containerfile .
install: install:
docker run -it --rm \ ${CONTAINER_ENGINE} run -it --rm --privileged \
--volume /usr/local/bin:/target \ --volume ./bin:/target \
stifstof/teams-desktop:latest install docker.io/stifstof/teams-desktop:latest install
uninstall: uninstall:
docker run -it --rm \ ${CONTAINER_ENGINE} run -it --rm --privileged \
--volume /usr/local/bin:/target \ --volume ./bin:/target \
stifstof/teams-desktop:latest uninstall docker.io/stifstof/teams-desktop:latest uninstall
# convenience jobs # convenience jobs
push:
echo ${DOCKERHUB_STIFSTOF_PW} | podman login docker.io -u stifstof --password-stdin
${CONTAINER_ENGINE} push docker.io/stifstof/teams-desktop:latest
reinstall: reinstall:
make uninstall make uninstall
make build make build
@@ -28,4 +37,20 @@ reinstall:
create-empty-config-folders: create-empty-config-folders:
mkdir ~/.config/Microsoft mkdir ~/.config/Microsoft
mkdir ~/.config/MicrosoftTwo mkdir ~/.config/MicrosoftTwo
# system setup
add-to-path:
export PATH=$PATH:/home/cn/Documents/git/TeamsInDocker/bin
podman:
rm -f .env
echo "CONTAINER_ENGINE=podman" >> .env
docker:
rm -f .env
echo "CONTAINER_ENGINE=docker" >> .env
current_runtime:
cat .env

View File

@@ -1,8 +1,16 @@
# Microsoft Teams in Docker # Microsoft Teams in Container
![](https://i.imgur.com/pVwxCtz.png) ![](https://i.imgur.com/pVwxCtz.png)
This projects objective is to provide Microsoft Teams as a container to enable multiple accounts to be used simultaniously.
This projects objective is to provide Microsoft Teams as a docker image to enable multiple accounts to be used simultaniously. Currently the project supports Docker and Podman. Select which runtime you want with the convenient make targets:
Makefile (System setup)
- docker
- podman
- current_runtime
The default runtime is Docker. Select podman with "make podman" and confirm with "make current_runtime".
The Makefile contains the relevant commands to use the application. The project works with two accounts, but can be extended to any number of accounts (not tested). The Makefile contains the relevant commands to use the application. The project works with two accounts, but can be extended to any number of accounts (not tested).
@@ -45,6 +53,3 @@ Simply run
make kill-containers make kill-containers
make uninstall make uninstall
``` ```
Remmember to kill the containers with

1
bin/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
teams-*

View File

@@ -11,16 +11,12 @@ install_teams_desktop() {
echo "Installing teams-wrapper..." echo "Installing teams-wrapper..."
install -m 0755 /var/cache/teams/teams-wrapper /target/ install -m 0755 /var/cache/teams/teams-wrapper /target/
install -m 0755 /var/cache/teams/teams-wrapper-two /target/ install -m 0755 /var/cache/teams/teams-wrapper-two /target/
echo "Installing teams..."
ln -sf teams-wrapper /target/teams
} }
uninstall_teams_desktop() { uninstall_teams_desktop() {
echo "Uninstalling teams-wrapper..." echo "Uninstalling teams-wrapper..."
rm -rf /target/teams-wrapper rm -rf /target/teams-wrapper
rm -rf /target/teams-wrapper-two rm -rf /target/teams-wrapper-two
echo "Uninstalling teams..."
rm -rf /target/teams
} }
create_user() { create_user() {
@@ -54,9 +50,10 @@ grant_access_to_video_devices() {
launch_teams_desktop() { launch_teams_desktop() {
cd /home/${TEAMS_DESKTOP_USER} cd /home/${TEAMS_DESKTOP_USER}
sudo -HEu ${TEAMS_DESKTOP_USER} PULSE_SERVER=/run/pulse/native $@ sudo -u ${TEAMS_DESKTOP_USER} teams
# exec sudo -HEu ${TEAMS_DESKTOP_USER} PULSE_SERVER=/run/pulse/native QT_GRAPHICSSYSTEM="native" $@ # exec sudo -HEu ${TEAMS_DESKTOP_USER} PULSE_SERVER=/run/pulse/native QT_GRAPHICSSYSTEM="native" $@
tail -f /home/${TEAMS_DESKTOP_USER}/.config/Microsoft/Microsoft\ Teams/logs/teams-startup.log tail -f /home/${TEAMS_DESKTOP_USER}/.config/Microsoft/Microsoft\ Teams/logs/teams-startup.log
stat /home/${TEAMS_DESKTOP_USER}/.config/Microsoft/Microsoft\ Teams/logs/teams-startup.log
} }
case "$1" in case "$1" in

View File

@@ -4,28 +4,34 @@
SCRIPT_NAME="teams-wrapper" SCRIPT_NAME="teams-wrapper"
LOCAL_COMPUTER_USERNAME=$(whoami) LOCAL_COMPUTER_USERNAME=$(whoami)
# Docker config # registry config
IMAGE_NAME="stifstof/teams-desktop:latest" IMAGE_NAME="docker.io/stifstof/teams-desktop:latest"
CONTAINER_NAME="teams" CONTAINER_NAME="teams"
CONFIG_PATH="${HOME}/.config/Microsoft" CONFIG_PATH="${HOME}/.config/Microsoft"
# Container runtime (docker or podman)
CONTAINER_ENGINE="${CONTAINER_ENGINE}"
if [ -z "$CONTAINER_ENGINE" ]
then
echo "\$CONTAINER_ENGINE is empty. Defaulting to podman"
CONTAINER_ENGINE="podman"
fi
########## Script ########## Script
PATH=/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PATH=/home/cn/Documents/git/TeamsInDocker/bin:/usr/sbin:/usr/bin:/sbin:/bin
TEAMS_DESKTOP_USER=${LOCAL_COMPUTER_USERNAME} TEAMS_DESKTOP_USER=${LOCAL_COMPUTER_USERNAME}
XSOCK=/home/$TEAMS_DESKTOP_USER/X/teamsOne/.X11-unix
XAUTH=/home/$TEAMS_DESKTOP_USER/X/teamsOne/."${CONTAINER_ENGINE}".xauth
# do we need to use sudo to start docker containers? # do we need to use sudo to start containers?
(id -Gn | grep -q docker) || SUDO=sudo if [ "$CONTAINER_ENGINE" == "docker" ]; then
(id -Gn | grep -q $CONTAINER_ENGINE) || SUDO=sudo
fi
USER_UID=$(id -u) USER_UID=$(id -u)
USER_GID=$(id -g) USER_GID=$(id -g)
XSOCK=/tmp/.X11-unix-teamsOne
XAUTH=/tmp/.docker.xauth-teamsOne
DOWNLOAD_DIR=$(xdg-user-dir DOWNLOAD) DOWNLOAD_DIR=$(xdg-user-dir DOWNLOAD)
if [ -z "${DOWNLOAD_DIR}" ]; then if [ -z "${DOWNLOAD_DIR}" ]; then
@@ -35,26 +41,29 @@ fi
list_commands() { list_commands() {
echo "" echo ""
echo "Launch teams using:" echo "Launch teams using:"
echo " teams OR "
echo " teams-wrapper teams" echo " teams-wrapper teams"
echo "" echo ""
exit 1 exit 1
} }
cleanup_stopped_teams_desktop_instances() { cleanup_stopped_teams_desktop_instances() {
echo "Cleaning up stopped teams-desktop instances..." echo "Cleaning up stopped teams instances..."
for c in $(${SUDO} docker ps -a -q); do for c in $(${SUDO} ${CONTAINER_ENGINE} ps -a -q); do
image="$(${SUDO} docker inspect -f {{.Config.Image}} ${c})" image="$(${SUDO} ${CONTAINER_ENGINE} inspect -f {{.Name}} ${c})"
if [ "${image}" == ${IMAGE_NAME} ]; then if [ "${image}" == "${CONTAINER_NAME}" ]; then
running=$(${SUDO} docker inspect -f {{.State.Running}} ${c}) running=$(${SUDO} ${CONTAINER_ENGINE} inspect -f {{.State.Running}} ${c})
if [ "${running}" != "true" ]; then if [ "${running}" != "true" ]; then
${SUDO} docker rm "${c}" >/dev/null ${SUDO} ${CONTAINER_ENGINE} rm "${c}" >/dev/null
fi
if [ "${running}" == "true" ]; then
${SUDO} ${CONTAINER_ENGINE} kill "${c}" >/dev/null
${SUDO} ${CONTAINER_ENGINE} rm "${c}" >/dev/null
fi fi
fi fi
done done
} }
prepare_docker_env_parameters() { prepare_container_env_parameters() {
ENV_VARS+=" --env=USER_UID=${USER_UID}" ENV_VARS+=" --env=USER_UID=${USER_UID}"
ENV_VARS+=" --env=USER_GID=${USER_GID}" ENV_VARS+=" --env=USER_GID=${USER_GID}"
ENV_VARS+=" --env=DISPLAY=unix$DISPLAY" ENV_VARS+=" --env=DISPLAY=unix$DISPLAY"
@@ -63,8 +72,18 @@ prepare_docker_env_parameters() {
ENV_VARS+=" --env=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/dbus/system_bus_socket" ENV_VARS+=" --env=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/dbus/system_bus_socket"
} }
prepare_docker_volume_parameters() { create_x_folder() {
mkdir "/home/$TEAMS_DESKTOP_USER/X/teamsOne/"
touch ${XAUTH} touch ${XAUTH}
touch ${XSOCK}
}
prepare_container_volume_parameters() {
if [ -d "/home/$TEAMS_DESKTOP_USER/X/teamsOne/" ]; then
rm -rf "/home/$TEAMS_DESKTOP_USER/X/teamsOne/"
fi
create_x_folder
xauth nlist :0 | sed -e 's/^..../ffff/' | xauth -f ${XAUTH} nmerge - xauth nlist :0 | sed -e 's/^..../ffff/' | xauth -f ${XAUTH} nmerge -
VOLUMES+=" --volume=${CONFIG_PATH}:/home/${TEAMS_DESKTOP_USER}/.config/Microsoft/" VOLUMES+=" --volume=${CONFIG_PATH}:/home/${TEAMS_DESKTOP_USER}/.config/Microsoft/"
@@ -79,7 +98,7 @@ prepare_docker_volume_parameters() {
} }
prepare_docker_device_parameters() { prepare_container_device_parameters() {
# enumerate video devices for webcam support # enumerate video devices for webcam support
VIDEO_DEVICES= VIDEO_DEVICES=
for device in /dev/video*; do for device in /dev/video*; do
@@ -109,24 +128,21 @@ elif [[ -n ${exec} ]]; then
fi fi
cleanup_stopped_teams_desktop_instances cleanup_stopped_teams_desktop_instances
prepare_docker_env_parameters prepare_container_env_parameters
prepare_docker_volume_parameters prepare_container_volume_parameters
prepare_docker_device_parameters prepare_container_device_parameters
echo "Starting ${prog}..." echo "Starting ${prog}..."
${SUDO} docker run -d \ set -o xtrace
${SUDO} ${CONTAINER_ENGINE} run -d \
--name ${CONTAINER_NAME} \ --name ${CONTAINER_NAME} \
--network host \ --network host \
--privileged \ --memory=4g \
--memory=8g \ --shm-size=4g \
--shm-size=8g \
--device /dev/dri \ --device /dev/dri \
--device /dev/snd \ --device /dev/snd \
--cap-add=SYS_ADMIN \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e DISPLAY=unix$DISPLAY \
${ENV_VARS} \ ${ENV_VARS} \
${VIDEO_DEVICES} \ ${VIDEO_DEVICES} \
${VOLUMES} \ ${VOLUMES} \
${TEAMS_EXTRA_DOCKER_ARGUMENTS} \ ${TEAMS_EXTRA_CONTAINER_ARGUMENTS} \
${IMAGE_NAME} ${prog} $@ >/dev/null ${IMAGE_NAME} ${prog} $@ >/dev/null

View File

@@ -4,28 +4,34 @@
SCRIPT_NAME="teams-wrapper-two" SCRIPT_NAME="teams-wrapper-two"
LOCAL_COMPUTER_USERNAME=$(whoami) LOCAL_COMPUTER_USERNAME=$(whoami)
# Docker config # config
IMAGE_NAME="stifstof/teams-desktop:latest" IMAGE_NAME="docker.io/stifstof/teams-desktop:latest"
CONTAINER_NAME="teams-two" CONTAINER_NAME="teams-two"
CONFIG_PATH="${HOME}/.config/MicrosoftTwo" CONFIG_PATH="${HOME}/.config/MicrosoftTwo"
# Container runtime (docker or podman)
CONTAINER_ENGINE="${CONTAINER_ENGINE}"
if [ -z "$CONTAINER_ENGINE" ]
then
echo "\$CONTAINER_ENGINE is empty. Defaulting to podman"
CONTAINER_ENGINE="podman"
fi
########## Script ########## Script
PATH=/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PATH=/home/cn/Documents/git/TeamsInDocker/bin:/usr/sbin:/usr/bin:/sbin:/bin
TEAMS_DESKTOP_USER=${LOCAL_COMPUTER_USERNAME} TEAMS_DESKTOP_USER=${LOCAL_COMPUTER_USERNAME}
XSOCK=/home/$TEAMS_DESKTOP_USER/X/teamsTwo/.X11-unix
XAUTH=/home/$TEAMS_DESKTOP_USER/X/teamsTwo/."${CONTAINER_ENGINE}".xauth
# do we need to use sudo to start docker containers? # do we need to use sudo to start docker containers?
(id -Gn | grep -q docker) || SUDO=sudo if [ "$CONTAINER_ENGINE" == "docker" ]; then
(id -Gn | grep -q $CONTAINER_ENGINE) || SUDO=sudo
fi
USER_UID=$(id -u) USER_UID=$(id -u)
USER_GID=$(id -g) USER_GID=$(id -g)
XSOCK=/tmp/.X11-unix-teamsTwo
XAUTH=/tmp/.docker.xauth-teamsTwo
DOWNLOAD_DIR=$(xdg-user-dir DOWNLOAD) DOWNLOAD_DIR=$(xdg-user-dir DOWNLOAD)
if [ -z "${DOWNLOAD_DIR}" ]; then if [ -z "${DOWNLOAD_DIR}" ]; then
@@ -35,26 +41,29 @@ fi
list_commands() { list_commands() {
echo "" echo ""
echo "Launch teams using:" echo "Launch teams using:"
echo " teams OR "
echo " teams-wrapper teams" echo " teams-wrapper teams"
echo "" echo ""
exit 1 exit 1
} }
cleanup_stopped_teams_desktop_instances() { cleanup_stopped_teams_desktop_instances() {
echo "Cleaning up stopped teams-desktop instances..." echo "Cleaning up stopped teams instances..."
for c in $(${SUDO} docker ps -a -q); do for c in $(${SUDO} ${CONTAINER_ENGINE} ps -a -q); do
image="$(${SUDO} docker inspect -f {{.Config.Image}} ${c})" image="$(${SUDO} ${CONTAINER_ENGINE} inspect -f {{.Name}} ${c})"
if [ "${image}" == ${IMAGE_NAME} ]; then if [ "${image}" == "${CONTAINER_NAME}" ]; then
running=$(${SUDO} docker inspect -f {{.State.Running}} ${c}) running=$(${SUDO} ${CONTAINER_ENGINE} inspect -f {{.State.Running}} ${c})
if [ "${running}" != "true" ]; then if [ "${running}" != "true" ]; then
${SUDO} docker rm "${c}" >/dev/null ${SUDO} ${CONTAINER_ENGINE} rm "${c}" >/dev/null
fi
if [ "${running}" == "true" ]; then
${SUDO} ${CONTAINER_ENGINE} kill "${c}" >/dev/null
${SUDO} ${CONTAINER_ENGINE} rm "${c}" >/dev/null
fi fi
fi fi
done done
} }
prepare_docker_env_parameters() { prepare_container_env_parameters() {
ENV_VARS+=" --env=USER_UID=${USER_UID}" ENV_VARS+=" --env=USER_UID=${USER_UID}"
ENV_VARS+=" --env=USER_GID=${USER_GID}" ENV_VARS+=" --env=USER_GID=${USER_GID}"
ENV_VARS+=" --env=DISPLAY=unix$DISPLAY" ENV_VARS+=" --env=DISPLAY=unix$DISPLAY"
@@ -63,8 +72,18 @@ prepare_docker_env_parameters() {
ENV_VARS+=" --env=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/dbus/system_bus_socket" ENV_VARS+=" --env=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/dbus/system_bus_socket"
} }
prepare_docker_volume_parameters() { create_x_folder() {
mkdir "/home/$TEAMS_DESKTOP_USER/X/teamsTwo/"
touch ${XAUTH} touch ${XAUTH}
touch ${XSOCK}
}
prepare_container_volume_parameters() {
if [ -d "/home/$TEAMS_DESKTOP_USER/X/teamsTwo/" ]; then
rm -rf "/home/$TEAMS_DESKTOP_USER/X/teamsTwo/"
fi
create_x_folder
xauth nlist :0 | sed -e 's/^..../ffff/' | xauth -f ${XAUTH} nmerge - xauth nlist :0 | sed -e 's/^..../ffff/' | xauth -f ${XAUTH} nmerge -
VOLUMES+=" --volume=${CONFIG_PATH}:/home/${TEAMS_DESKTOP_USER}/.config/Microsoft/" VOLUMES+=" --volume=${CONFIG_PATH}:/home/${TEAMS_DESKTOP_USER}/.config/Microsoft/"
@@ -79,7 +98,7 @@ prepare_docker_volume_parameters() {
} }
prepare_docker_device_parameters() { prepare_container_device_parameters() {
# enumerate video devices for webcam support # enumerate video devices for webcam support
VIDEO_DEVICES= VIDEO_DEVICES=
for device in /dev/video*; do for device in /dev/video*; do
@@ -109,24 +128,21 @@ elif [[ -n ${exec} ]]; then
fi fi
cleanup_stopped_teams_desktop_instances cleanup_stopped_teams_desktop_instances
prepare_docker_env_parameters prepare_container_env_parameters
prepare_docker_volume_parameters prepare_container_volume_parameters
prepare_docker_device_parameters prepare_container_device_parameters
echo "Starting ${prog}..." echo "Starting ${prog}..."
${SUDO} docker run -d \ set -o xtrace
${SUDO} ${CONTAINER_ENGINE} run -d \
--name ${CONTAINER_NAME} \ --name ${CONTAINER_NAME} \
--network host \ --network host \
--privileged \ --memory=4g \
--memory=8g \ --shm-size=4g \
--shm-size=8g \
--device /dev/dri \ --device /dev/dri \
--device /dev/snd \ --device /dev/snd \
--cap-add=SYS_ADMIN \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e DISPLAY=unix$DISPLAY \
${ENV_VARS} \ ${ENV_VARS} \
${VIDEO_DEVICES} \ ${VIDEO_DEVICES} \
${VOLUMES} \ ${VOLUMES} \
${TEAMS_EXTRA_DOCKER_ARGUMENTS} \ ${TEAMS_EXTRA_CONTAINER_ARGUMENTS} \
${IMAGE_NAME} ${prog} $@ >/dev/null ${IMAGE_NAME} ${prog} $@ >/dev/null