Docker ADR (#26085)

* Migrate Docker image to Hass.io / Multiarch

* Fix sudo

* Update CODEOWNERS

* Fix manifest

* Add more logic

* fix handling

* Move dockerfile

* Modify options
This commit is contained in:
Pascal Vizeli 2019-08-20 19:37:55 +02:00 committed by Paulus Schoutsen
parent daa0330da4
commit 97d3f49bb8
18 changed files with 62 additions and 548 deletions

View File

@ -2,11 +2,12 @@
{
"name": "Home Assistant Dev",
"context": "..",
"dockerFile": "Dockerfile",
"dockerFile": "../Dockerfile.dev",
"postCreateCommand": "pip3 install -e .",
"appPort": 8123,
"runArgs": [
"-e", "GIT_EDITOR=\"code --wait\""
"-e",
"GIT_EDITOR=\"code --wait\""
],
"extensions": [
"ms-python.python",
@ -31,4 +32,4 @@
"!include_dir_merge_named scalar"
]
}
}
}

View File

@ -9,10 +9,6 @@ homeassistant/*.py @home-assistant/core
homeassistant/helpers/* @home-assistant/core
homeassistant/util/* @home-assistant/core
# Virtualization
Dockerfile @home-assistant/docker
virtualization/Docker/* @home-assistant/docker
# Other code
homeassistant/scripts/check_config.py @kellerza

View File

@ -1,38 +0,0 @@
# Notice:
# When updating this file, please also update virtualization/Docker/Dockerfile.dev
# This way, the development image and the production image are kept in sync.
FROM python:3.7-buster
LABEL maintainer="Paulus Schoutsen <Paulus@PaulusSchoutsen.nl>"
# Uncomment any of the following lines to disable the installation.
#ENV INSTALL_TELLSTICK no
#ENV INSTALL_OPENALPR no
#ENV INSTALL_FFMPEG no
#ENV INSTALL_LIBCEC no
#ENV INSTALL_SSOCR no
#ENV INSTALL_DLIB no
#ENV INSTALL_IPERF3 no
#ENV INSTALL_LOCALES no
VOLUME /config
WORKDIR /usr/src/app
# Copy build scripts
COPY virtualization/Docker/ virtualization/Docker/
RUN virtualization/Docker/setup_docker_prereqs
# Install hass component dependencies
COPY requirements_all.txt requirements_all.txt
RUN pip3 install --no-cache-dir -r requirements_all.txt && \
pip3 install --no-cache-dir mysqlclient psycopg2 cchardet cython tensorflow
# Copy source
COPY . .
EXPOSE 8123
EXPOSE 8300
EXPOSE 51827
CMD [ "python", "-m", "homeassistant", "--config", "/config" ]

View File

@ -16,6 +16,7 @@ RUN apt-get update \
WORKDIR /usr/src
# Setup hass-release
RUN git clone --depth 1 https://github.com/home-assistant/hass-release \
&& cd hass-release \
&& pip3 install -e .

View File

@ -60,7 +60,7 @@ stages:
- script: |
export TWINE_USERNAME="$(twineUser)"
export TWINE_PASSWORD="$(twinePassword)"
twine upload dist/* --skip-existing
displayName: 'Upload pypi'
- job: 'ReleaseDocker'
@ -150,3 +150,59 @@ stages:
git commit -am "Bump Home Assistant $version"
git push
displayName: 'Update version files'
- job: 'ReleaseDocker'
pool:
vmImage: 'ubuntu-latest'
steps:
- script: |
set -e
export DOCKER_CLI_EXPERIMENTAL=enabled
function create_manifest() {
local tag_l=$1
local tag_r=$2
sudo docker manifest create homeassistant/home-assistant:${tag_l} \
homeassistant/amd64-homeassistant:${tag_r} \
homeassistant/i386-homeassistant:${tag_r} \
homeassistant/armhf-homeassistant:${tag_r} \
homeassistant/armv7-homeassistant:${tag_r} \
homeassistant/aarch64-homeassistant:${tag_r}
sudo docker manifest annotate homeassistant/home-assistant:${tag_l} \
homeassistant/amd64-homeassistant:${tag_r} \
--os linux --arch amd64
sudo docker manifest annotate homeassistant/home-assistant:${tag_l} \
homeassistant/i386-homeassistant:${tag_r} \
--os linux --arch i386
sudo docker manifest annotate homeassistant/home-assistant:${tag_l} \
homeassistant/armhf-homeassistant:${tag_r} \
--os linux --arch arm --variant=v6
sudo docker manifest annotate homeassistant/home-assistant:${tag_l} \
homeassistant/armv7-homeassistant:${tag_r} \
--os linux --arch arm --variant=v7
sudo docker manifest annotate homeassistant/home-assistant:${tag_l} \
homeassistant/aarch64-homeassistant:${tag_r} \
--os linux --arch arm64 --variant=v8
sudo docker manifest push --purge homeassistant/home-assistant:${tag_l}
}
# Create version tag
create_manifest "$(Build.SourceBranchName)" "$(Build.SourceBranchName)"
# Create general tags
if [[ "$version" =~ d ]]; then
create_manifest "dev" "$(Build.SourceBranchName)"
elif [[ "$version" =~ b ]]; then
create_manifest "beta" "$(Build.SourceBranchName)"
else
create_manifest "stable" "$(Build.SourceBranchName)"
create_manifest "latest" "$(Build.SourceBranchName)"
fi
displayName: 'Create Meta-Image'

View File

@ -15,10 +15,6 @@ homeassistant/*.py @home-assistant/core
homeassistant/helpers/* @home-assistant/core
homeassistant/util/* @home-assistant/core
# Virtualization
Dockerfile @home-assistant/docker
virtualization/Docker/* @home-assistant/docker
# Other code
homeassistant/scripts/check_config.py @kellerza

View File

@ -1,64 +0,0 @@
# Dockerfile for development
# Based on the production Dockerfile, but with development additions.
# Keep this file as close as possible to the production Dockerfile, so the environments match.
FROM python:3.7-buster
LABEL maintainer="Paulus Schoutsen <Paulus@PaulusSchoutsen.nl>"
# Uncomment any of the following lines to disable the installation.
#ENV INSTALL_TELLSTICK no
#ENV INSTALL_OPENALPR no
#ENV INSTALL_FFMPEG no
#ENV INSTALL_LIBCEC no
#ENV INSTALL_COAP no
#ENV INSTALL_SSOCR no
#ENV INSTALL_DLIB no
#ENV INSTALL_IPERF3 no
#ENV INSTALL_LOCALES no
VOLUME /config
WORKDIR /usr/src/app
# Copy build scripts
COPY virtualization/Docker/ virtualization/Docker/
RUN virtualization/Docker/setup_docker_prereqs
# Install hass component dependencies
COPY requirements_all.txt requirements_all.txt
RUN pip3 install --no-cache-dir -r requirements_all.txt && \
pip3 install --no-cache-dir mysqlclient psycopg2 cchardet cython
# BEGIN: Development additions
# Install git
RUN apt-get update \
&& apt-get install -y --no-install-recommends git \
&& rm -rf /var/lib/apt/lists/*
# Install nodejs
RUN curl -sL https://deb.nodesource.com/setup_7.x | bash - && \
apt-get install -y nodejs
# Install tox
RUN pip3 install --no-cache-dir tox
# Copy over everything required to run tox
COPY requirements_test_all.txt setup.cfg setup.py tox.ini ./
COPY homeassistant/const.py homeassistant/const.py
# Prefetch dependencies for tox
COPY homeassistant/package_constraints.txt homeassistant/package_constraints.txt
RUN tox -e py37 --notest
# END: Development additions
# Copy source
COPY . .
EXPOSE 8123
EXPOSE 8300
EXPOSE 51827
CMD [ "python", "-m", "homeassistant", "--config", "/config" ]

View File

@ -1,47 +0,0 @@
#!/bin/sh
# Sets up libcec.
# Dependencies that need to be installed:
# apt-get install cmake libudev-dev libxrandr-dev swig
# Stop on errors
set -e
# Load required information about the current python environment
PYTHON_LIBDIR=$(python -c 'from distutils import sysconfig; print(sysconfig.get_config_var("LIBDIR"))')
PYTHON_LDLIBRARY=$(python -c 'from distutils import sysconfig; print(sysconfig.get_config_var("LDLIBRARY"))')
PYTHON_LIBRARY="${PYTHON_LIBDIR}/${PYTHON_LDLIBRARY}"
PYTHON_INCLUDE_DIR=$(python -c 'from distutils import sysconfig; print(sysconfig.get_python_inc())')
cd /usr/src/app/
mkdir -p build && cd build
if [ ! -d libcec ]; then
git clone --branch release --depth 1 https://github.com/Pulse-Eight/libcec.git
fi
cd libcec
git checkout release
git pull
git submodule update --init src/platform
# Build libcec platform libs
(
mkdir -p src/platform/build
cd src/platform/build
cmake ..
make
make install
)
# Build libcec
(
mkdir -p build && cd build
cmake \
-DPYTHON_LIBRARY="${PYTHON_LIBRARY}" \
-DPYTHON_INCLUDE_DIR="${PYTHON_INCLUDE_DIR}" \
..
make -j$(nproc)
make install
ldconfig
)

View File

@ -1,12 +0,0 @@
#!/bin/bash
# Sets up locales.
# Stop on errors
set -e
apt-get update
apt-get install -y --no-install-recommends locales
# Set the locale
sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen
locale-gen

View File

@ -1,32 +0,0 @@
#!/bin/bash
# Sets up openalpr.
# Stop on errors
set -e
PACKAGES=(
# homeassistant.components.image_processing.openalpr_local
libopencv-dev libtesseract-dev libleptonica-dev liblog4cplus-dev
)
apt-get install -y --no-install-recommends ${PACKAGES[@]}
cd /usr/src/app/
mkdir -p build && cd build
# Clone the latest code from GitHub
git clone --depth 1 https://github.com/openalpr/openalpr.git openalpr
# Setup the build directory
cd openalpr/src/
mkdir -p build
cd build
# Setup the compile environment
cmake -DWITH_TESTS=FALSE -DWITH_BINDING_JAVA=FALSE --DWITH_BINDING_PYTHON=FALSE --DWITH_BINDING_GO=FALSE -DWITH_DAEMON=FALSE -DCMAKE_INSTALL_PREFIX:PATH=/usr/local ..
# compile the library
make -j$(nproc)
# Install the binaries/libraries to your local system (prefix is /usr/local)
make install

View File

@ -1,24 +0,0 @@
#!/bin/bash
# Sets up ssocr to support Seven Segments Display.
# Stop on errors
set -e
PACKAGES=(
libimlib2 libimlib2-dev
)
apt-get install -y --no-install-recommends ${PACKAGES[@]}
cd /usr/src/app/
mkdir -p build && cd build
# Clone the latest code from GitHub
git clone --depth 1 https://github.com/auerswal/ssocr.git ssocr
cd ssocr/
# Compile the library
make -j$(nproc)
# Install the binaries/libraries to your local system (prefix is /usr/local)
make install

View File

@ -1,17 +0,0 @@
#!/bin/bash
# Sets up tellstick.
# Stop on errors
set -e
PACKAGES=(
# homeassistant.components.tellstick
libtelldus-core2 socat
)
# Add Tellstick repository
echo "deb http://download.telldus.com/debian/ stable main" >> /etc/apt/sources.list.d/telldus.list
wget -qO - http://download.telldus.com/debian/telldus-public.key | apt-key add -
apt-get update
apt-get install -y --no-install-recommends ${PACKAGES[@]}

View File

@ -1,84 +0,0 @@
#!/bin/bash
# Install requirements and build dependencies for Home Assistant in Docker.
# Stop on errors
set -e
INSTALL_TELLSTICK="${INSTALL_TELLSTICK:-yes}"
INSTALL_OPENALPR="${INSTALL_OPENALPR:-yes}"
INSTALL_LIBCEC="${INSTALL_LIBCEC:-yes}"
INSTALL_SSOCR="${INSTALL_SSOCR:-yes}"
INSTALL_DLIB="${INSTALL_DLIB:-yes}"
INSTALL_LOCALES="${INSTALL_LOCALES:-yes}"
# Required debian packages for running hass or components
PACKAGES=(
# build-essential is required for python pillow module on non-x86_64 arch
build-essential
# homeassistant.components.image_processing.openalpr_local
libxrandr-dev
# homeassistant.components.device_tracker.nmap_tracker
nmap net-tools libcurl3-dev
# homeassistant.components.device_tracker.bluetooth_tracker
bluetooth libglib2.0-dev libbluetooth-dev
# homeassistant.components.device_tracker.owntracks
libsodium23
# homeassistant.components.zwave
libudev-dev
# homeassistant.components.homekit_controller
libmpc-dev libmpfr-dev libgmp-dev
# homeassistant.components.ffmpeg
ffmpeg
# homeassistant.components.stream
libavformat-dev libavcodec-dev libavdevice-dev
libavutil-dev libswscale-dev libswresample-dev libavfilter-dev
# homeassistant.components.sensor.iperf3
iperf3
)
# Required debian packages for building dependencies
PACKAGES_DEV=(
cmake
git
swig
)
# Install packages
apt-get update
apt-get install -y --no-install-recommends ${PACKAGES[@]} ${PACKAGES_DEV[@]}
# This is a list of scripts that install additional dependencies. If you only
# need to install a package from the official debian repository, just add it
# to the list above. Only create a script if you need compiling, manually
# downloading or a 3rd party repository.
if [ "$INSTALL_TELLSTICK" == "yes" ]; then
virtualization/Docker/scripts/tellstick
fi
if [ "$INSTALL_OPENALPR" == "yes" ]; then
virtualization/Docker/scripts/openalpr
fi
if [ "$INSTALL_LIBCEC" == "yes" ]; then
virtualization/Docker/scripts/libcec
fi
if [ "$INSTALL_SSOCR" == "yes" ]; then
virtualization/Docker/scripts/ssocr
fi
if [ "$INSTALL_DLIB" == "yes" ]; then
pip3 install --no-cache-dir "dlib>=19.5"
fi
if [ "$INSTALL_LOCALES" == "yes" ]; then
virtualization/Docker/scripts/locales
fi
# Remove packages
apt-get remove -y --purge ${PACKAGES_DEV[@]}
apt-get -y --purge autoremove
# Cleanup
apt-get clean
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/src/app/build/

View File

@ -1,24 +0,0 @@
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
config.vm.box = "debian/contrib-stretch64"
config.vm.synced_folder "../../", "/home-assistant"
config.vm.synced_folder "./config", "/root/.homeassistant"
config.vm.network "forwarded_port", guest: 8123, host: 8123
config.vm.provision "fix-no-tty", type: "shell" do |shell|
shell.path = "provision.sh"
end
config.vm.provider :virtualbox do |vb|
vb.cpus = 2
vb.customize ['modifyvm', :id, '--memory', '1024']
end
config.vm.provider :hyperv do |h, override|
override.vm.box = "generic/debian9"
override.vm.hostname = "contrib-stretch"
h.vmname = "home-assistant"
h.cpus = 2
h.memory = 1024
h.maxmemory = 1024
end
end

View File

@ -1,23 +0,0 @@
# This is a simple service file for systems with systemd to tun HA as user.
#
# For details please check https://home-assistant.io/getting-started/autostart/
#
[Unit]
Description=Home Assistant for %i
After=network.target
[Service]
Type=simple
User=%i
# Enable the following line if you get network-related HA errors during boot
#ExecStartPre=/usr/bin/sleep 60
# Use `whereis hass` to determine the path of hass
ExecStart=/usr/bin/hass --runner
SendSIGKILL=no
RestartForceExitStatus=100
# on vagrant (vboxfs), disable sendfile https://www.virtualbox.org/ticket/9069
Environment=AIOHTTP_NOSENDFILE=1
[Install]
WantedBy=multi-user.target

View File

@ -1,50 +0,0 @@
@echo off
call:main %*
goto:eof
:usage
echo.############################################################
echo.
echo.Use `./provision.bat` to interact with HASS. E.g:
echo.
echo.- setup the environment: `./provision.bat start`
echo.- restart HASS process: `./provision.bat restart`
echo.- run test suit: `./provision.bat tests`
echo.- destroy the host and start anew: `./provision.bat recreate`
echo.
echo.Official documentation at https://home-assistant.io/docs/installation/vagrant/
echo.
echo.############################################################'
goto:eof
:main
if "%*"=="setup" (
if exist setup_done del setup_done
vagrant up --provision
copy /y nul setup_done
) else (
if "%*"=="tests" (
copy /y nul run_tests
vagrant provision
) else (
if "%*"=="restart" (
copy /y nul restart
vagrant provision
) else (
if "%*"=="start" (
vagrant up --provision
) else (
if "%*"=="stop" (
vagrant halt
) else (
if "%*"=="destroy" (
vagrant destroy -f
) else (
if "%*"=="recreate" (
if exist setup_done del setup_done
if exist restart del restart
vagrant destroy -f
vagrant up --provision
) else (
call:usage
)))))))

View File

@ -1,121 +0,0 @@
#!/bin/bash
set -e
readonly SETUP_DONE='/home-assistant/virtualization/vagrant/setup_done'
readonly RUN_TESTS='/home-assistant/virtualization/vagrant/run_tests'
readonly RESTART='/home-assistant/virtualization/vagrant/restart'
usage() {
echo '############################################################
Use `./provision.sh` to interact with HASS. E.g:
- setup the environment: `./provision.sh start`
- restart HASS process: `./provision.sh restart`
- run test suit: `./provision.sh tests`
- destroy the host and start anew: `./provision.sh recreate`
Official documentation at https://home-assistant.io/docs/installation/vagrant/
############################################################'
}
print_done() {
echo '############################################################
HASS running => http://localhost:8123/
'
}
setup_error() {
echo '############################################################
Something is off... maybe setup did not complete properly?
Please ensure setup did run correctly at least once.
To run setup again: `./provision.sh setup`
############################################################'
exit 1
}
setup() {
local hass_path='/root/venv/bin/hass'
local systemd_bin_path='/usr/bin/hass'
# Setup systemd
cp /home-assistant/virtualization/vagrant/home-assistant@.service \
/etc/systemd/system/home-assistant.service
systemctl --system daemon-reload
systemctl enable home-assistant
systemctl stop home-assistant
# Install packages
apt-get update
apt-get install -y git rsync python3-dev python3-pip libssl-dev libffi-dev
pip3 install --upgrade virtualenv
virtualenv ~/venv
source ~/venv/bin/activate
pip3 install --upgrade tox
/home-assistant/script/setup
if ! [ -f $systemd_bin_path ]; then
ln -s $hass_path $systemd_bin_path
fi
touch $SETUP_DONE
print_done
usage
}
run_tests() {
rm -f $RUN_TESTS
echo '############################################################'
echo; echo "Running test suite, hang on..."; echo; echo
if ! systemctl stop home-assistant; then
setup_error
fi
source ~/venv/bin/activate
rsync -a --delete \
--exclude='*.tox' \
--exclude='*.git' \
--exclude='.vagrant' \
--exclude='lib64' \
--exclude='bin/python' \
--exclude='bin/python3' \
/home-assistant/ /home-assistant-tests/
cd /home-assistant-tests && tox || true
echo '############################################################'
}
restart() {
echo "Restarting Home Assistant..."
if ! systemctl restart home-assistant; then
setup_error
else
echo "done"
fi
rm $RESTART
}
main() {
# If a parameter is provided, we assume it's the user interacting
# with the provider script...
case $1 in
"setup") rm -f setup_done; vagrant up --provision && touch setup_done; exit ;;
"tests") touch run_tests; vagrant provision ; exit ;;
"restart") touch restart; vagrant provision ; exit ;;
"start") vagrant up --provision ; exit ;;
"stop") vagrant halt ; exit ;;
"destroy") vagrant destroy -f ; exit ;;
"recreate") rm -f setup_done restart; vagrant destroy -f; \
vagrant up --provision; exit ;;
esac
# ...otherwise we assume it's the Vagrant provisioner
if [ $(hostname) != "contrib-jessie" ] && [ $(hostname) != "contrib-stretch" ]; then usage; exit; fi
if ! [ -f $SETUP_DONE ]; then setup; fi
if [ -f $RESTART ]; then restart; fi
if [ -f $RUN_TESTS ]; then run_tests; fi
if ! systemctl start home-assistant; then
setup_error
fi
}
main $*