Browse Source

added dockerfile & docker-compose.yml

Fabian Peter Hammerle 3 years ago
parent
commit
74669520c1
5 changed files with 107 additions and 1 deletions
  1. 9 0
      .dockerignore
  2. 58 0
      Dockerfile
  3. 6 0
      README.md
  4. 28 0
      docker-compose.yml
  5. 6 1
      systemctl_mqtt/__init__.py

+ 9 - 0
.dockerignore

@@ -0,0 +1,9 @@
+*
+# setuptools_scm
+!.git/
+!COPYING
+!Pipfile
+!Pipfile.lock
+!README.md
+!setup.py
+!systemctl_mqtt

+ 58 - 0
Dockerfile

@@ -0,0 +1,58 @@
+# not using python:3.*-alpine cause glib-dev package depends on python3
+# https://pkgs.alpinelinux.org/package/v3.11/main/aarch64/glib-dev
+ARG BASE_IMAGE=alpine:3.11
+ARG SOURCE_DIR_PATH=/systemctl-mqtt
+ARG VIRTUALENV_PATH=$SOURCE_DIR_PATH/.venv
+
+
+FROM $BASE_IMAGE as build
+
+RUN apk add --no-cache \
+    dbus-dev \
+    gcc \
+    git `# setuptools_scm` \
+    glib-dev `# dbus-python` \
+    make `# dbus-python` \
+    musl-dev `# dbus-python` \
+    py3-virtualenv \
+    python3-dev `# dbus-python`
+
+ARG SOURCE_DIR_PATH
+RUN mkdir $SOURCE_DIR_PATH \
+    && chown nobody $SOURCE_DIR_PATH
+USER nobody
+
+ARG VIRTUALENV_PATH
+RUN virtualenv --no-site-packages $VIRTUALENV_PATH
+ENV PATH=$VIRTUALENV_PATH/bin:$PATH
+WORKDIR $SOURCE_DIR_PATH
+RUN pip install --no-cache-dir pipenv==2020.6.2
+COPY --chown=nobody . $SOURCE_DIR_PATH
+ENV PIPENV_CACHE_DIR=/tmp/pipenv-cache
+RUN pipenv install --deploy --verbose \
+    && rm -r .git/ $PIPENV_CACHE_DIR
+
+# workaround for broken multi-stage copy
+# > failed to copy files: failed to copy directory: Error processing tar file(exit status 1): Container ID ... cannot be mapped to a host ID
+USER 0
+RUN chown -R 0:0 $SOURCE_DIR_PATH
+
+
+FROM $BASE_IMAGE
+
+RUN apk add --no-cache \
+        ca-certificates \
+        dbus-libs \
+        python3 \
+        tini \
+    && find / -xdev -type f -perm /u+s -exec chmod -c u-s {} \; \
+    && find / -xdev -type f -perm /g+s -exec chmod -c g-s {} \;
+
+USER nobody
+
+ARG SOURCE_DIR_PATH
+COPY --from=build $SOURCE_DIR_PATH $SOURCE_DIR_PATH
+ARG VIRTUALENV_PATH
+ENV PATH=$VIRTUALENV_PATH/bin:$PATH
+ENTRYPOINT ["tini", "--"]
+CMD ["systemctl-mqtt", "--help"]

+ 6 - 0
README.md

@@ -50,6 +50,12 @@ homeassistant:
       icon: mdi:power
 ```
 
+## Docker 🐳
+
+1. Clone this repository.
+2. Edit `docker-compose.yml`.
+3. `docker-compose up --build`
+
 ## MQTT Authentication
 
 ```sh

+ 28 - 0
docker-compose.yml

@@ -0,0 +1,28 @@
+version: '2.2'
+
+volumes:
+  config:
+
+services:
+  mqtt_client:
+    build: .
+    image: fphammerle/systemctl-mqtt
+    volumes:
+    - config:/etc/systemctl-mqtt:ro
+    - /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket:rw
+    command: systemctl-mqtt
+      --mqtt-host mqtt-broker.local
+      --mqtt-username raspberrypi
+      --mqtt-password-file /etc/systemctl-mqtt/mqtt-password
+    hostname: raspberrypi
+    network_mode: host # TODO verify required
+    userns_mode: host # required for host network mode
+    user: root # TODO
+    security_opt:
+    - no-new-privileges
+    - apparmor=unconfined # TODO
+    # docker-compose >=2.2,<3
+    cpus: 0.4
+    mem_limit: 32M
+
+# https://docs.docker.com/compose/compose-file/compose-file-v2/

+ 6 - 1
systemctl_mqtt/__init__.py

@@ -52,7 +52,10 @@ def _schedule_shutdown(action: str) -> None:
         shutdown_datetime.isoformat(sep=" ", timespec="seconds"),
     )
     shutdown_epoch_usec = int(shutdown_datetime.timestamp() * 10 ** 6)
-    _get_login_manager().ScheduleShutdown(action, shutdown_epoch_usec)
+    try:
+        _get_login_manager().ScheduleShutdown(action, shutdown_epoch_usec)
+    except dbus.DBusException as exc:
+        _LOGGER.error("failed to schedule shutdown: %s", exc.get_dbus_message())
 
 
 _MQTT_TOPIC_SUFFIX_ACTION_MAPPING = {
@@ -101,7 +104,9 @@ def _mqtt_on_message(
     except KeyError:
         _LOGGER.warning("unexpected topic %s", message.topic)
         return
+    _LOGGER.debug("executing action %r", action)
     action()
+    _LOGGER.debug("completed action %r", action)
 
 
 def _run(