Add Ingress Support (#1)

* Add ingress support

* Development framework

* Add ARCH arg for correct s6 version

* Support new ARCH arg for correct s6 overlay version

* Add PR trigger to workflow

* Add image again

Co-authored-by: Matt White <matt.white@microsoft.com>
This commit is contained in:
Thomas Moore
2021-01-08 14:24:13 +00:00
committed by GitHub
co-authored by Matt White
parent 0a82b9eba8
commit d544873055
15 changed files with 319 additions and 25 deletions
+45
View File
@@ -0,0 +1,45 @@
FROM ubuntu:20.04
WORKDIR /workspaces
# Default ENV
ENV LANG C.UTF-8
ENV DEBIAN_FRONTEND noninteractive
# Set shell
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
# Use the mirror protocol for a fast mirror
RUN sed -i -e 's/http:\/\/archive\.ubuntu\.com\/ubuntu\//mirror:\/\/mirrors\.ubuntu\.com\/mirrors\.txt/' /etc/apt/sources.list
# Install docker, jq, socat
# https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/
RUN apt-get update && apt-get install -y --no-install-recommends \
apt-transport-https \
ca-certificates \
curl \
dbus \
software-properties-common \
gpg-agent \
git \
jq \
socat \
sudo \
&& curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - \
&& add-apt-repository "deb https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
&& apt-get update && apt-get install -y --no-install-recommends \
docker-ce \
docker-ce-cli \
containerd.io
# This is a development container. Don't bother to clean up apt cache, this way we have it handy later
COPY .devcontainer/start_ha.sh /usr/local/bin/start_ha.sh
# Install dependencies for the add-on development below. For example, if you're running Node.js,
# you may want something like the following...
# RUN apt-get install -y --no-install-recommends nodejs npm
# Generate a machine-id for this container
RUN rm /etc/machine-id && dbus-uuidgen --ensure=/etc/machine-id
ENV DEBIAN_FRONTEND=dialog
+29
View File
@@ -0,0 +1,29 @@
// For format details, see https://aka.ms/vscode-remote/devcontainer.json
// TODO: When https://github.com/microsoft/vscode-remote-release/issues/2129 is fixed, move to ${localWorkspaceFolderBasename}\
{
"name": "Home Assistant Add-On",
"context": "..",
"dockerFile": "Dockerfile",
"appPort": 8123,
"runArgs": [
"-e",
"GIT_EDITOR=code --wait",
"--privileged"
],
"settings": {
"terminal.integrated.shell.linux": "/bin/bash"
},
"workspaceMount": "source=${localWorkspaceFolder},target=/workspaces/test_hassio/addons/local/myaddon,type=bind,consistency=delegated",
"workspaceFolder": "/workspaces/test_hassio/addons/local/myaddon",
"mounts": [
// Cache docker images between devcontainer rebuilds (and share between devcontainers)
"source=vsc-hassio-docker,target=/var/lib/docker,type=volume"
]
// Post-create command to initialize the workspace. For example, for a node.js add-on you may want:
// "postCreateCommand": "cd /workspaces/test_hassio/addons/local/myaddon && npm install",
// "extensions": [
// "dbaeumer.vscode-eslint",
// "maty.vscode-mocha-sidebar"
// ]
}
+103
View File
@@ -0,0 +1,103 @@
#!/bin/bash
set -eE
DOCKER_TIMEOUT=30
DOCKER_PID=0
function start_docker() {
local starttime
local endtime
echo "Starting docker..."
dockerd 2> /dev/null &
DOCKER_PID=$!
echo "Waiting for docker to initialize..."
starttime="$(date +%s)"
endtime="$(date +%s)"
until docker info >/dev/null 2>&1; do
if [ $((endtime - starttime)) -le $DOCKER_TIMEOUT ]; then
sleep 1
endtime=$(date +%s)
else
echo "Timeout while waiting for docker to come up"
exit 1
fi
done
echo "Docker was initialized"
}
function stop_docker() {
local starttime
local endtime
echo "Stopping in container docker..."
if [ "$DOCKER_PID" -gt 0 ] && kill -0 "$DOCKER_PID" 2> /dev/null; then
starttime="$(date +%s)"
endtime="$(date +%s)"
# Now wait for it to die
kill "$DOCKER_PID"
while kill -0 "$DOCKER_PID" 2> /dev/null; do
if [ $((endtime - starttime)) -le $DOCKER_TIMEOUT ]; then
sleep 1
endtime=$(date +%s)
else
echo "Timeout while waiting for container docker to die"
exit 1
fi
done
else
echo "Your host might have been left with unreleased resources"
fi
}
function install() {
docker pull homeassistant/amd64-hassio-supervisor:dev
docker pull homeassistant/amd64-hassio-cli:dev
}
function cleanup_hass_data() {
rm -rf /workspaces/test_hassio/{apparmor,backup,config.json,dns,dns.json,homeassistant,homeassistant.json,ingress.json,share,ssl,tmp,updater.json}
rm -rf /workspaces/test_hassio/addons/{core,data,git}
}
function cleanup_docker() {
echo "Cleaning up stopped containers..."
docker rm $(docker ps -a -q)
}
function run_supervisor() {
docker run --rm --privileged \
--name hassio_supervisor \
--security-opt seccomp=unconfined \
--security-opt apparmor:unconfined \
-v /run/docker.sock:/run/docker.sock \
-v /run/dbus:/run/dbus \
-v "/workspaces/test_hassio":/data \
-v /etc/machine-id:/etc/machine-id:ro \
-e SUPERVISOR_SHARE="/workspaces/test_hassio" \
-e SUPERVISOR_NAME=hassio_supervisor \
-e SUPERVISOR_DEV=1 \
-e HOMEASSISTANT_REPOSITORY="homeassistant/qemux86-64-homeassistant" \
homeassistant/amd64-hassio-supervisor:dev
}
case "$1" in
"--cleanup")
echo "Cleaning up old environment"
cleanup_docker || true
cleanup_hass_data || true
exit 0;;
*)
echo "Creating development Home Assistant environment"
start_docker
trap "stop_docker" ERR
install
cleanup_docker || true
run_supervisor
stop_docker;;
esac