Browse Source

docker: multi-stage build to reduce target image size

Fabian Peter Hammerle 4 years ago
parent
commit
3e436f7e3e
1 changed files with 39 additions and 15 deletions
  1. 39 15
      Dockerfile

+ 39 - 15
Dockerfile

@@ -1,30 +1,54 @@
 # not using python:3.*-alpine cause glib-dev package depends on python3
 # https://pkgs.alpinelinux.org/package/v3.11/main/aarch64/glib-dev
-FROM alpine:3.11
+ARG BASE_IMAGE=alpine:3.11
+ARG SOURCE_DIR_PATH=/switchbot-mqtt
+ARG VIRTUALENV_PATH=$SOURCE_DIR_PATH/.venv
+
+
+FROM $BASE_IMAGE as build
 
 RUN apk add --no-cache \
     gcc \
     glib-dev \
     make \
     musl-dev \
-    tini
-# TODO merge
-RUN apk add --no-cache py3-virtualenv
-
-#RUN apk add bluez-deprecated `# hcitool`
+    py3-virtualenv
 
+ARG SOURCE_DIR_PATH
+RUN mkdir $SOURCE_DIR_PATH \
+    && chown nobody $SOURCE_DIR_PATH
 USER nobody
 
-ARG SOURCE_DIR_PATH=/switchbot-mqtt
-ARG SWITCHBOT_MQTT_VERSION=
-COPY --chown=nobody . $SOURCE_DIR_PATH
+ARG VIRTUALENV_PATH
+RUN virtualenv --no-site-packages $VIRTUALENV_PATH
+ENV PATH=$VIRTUALENV_PATH/bin:$PATH
 WORKDIR $SOURCE_DIR_PATH
-RUN virtualenv --no-site-packages .venv \
-    && source .venv/bin/activate \
-    && pip install --no-cache-dir pipenv \
-    && SETUPTOOLS_SCM_PRETEND_VERSION=$SWITCHBOT_MQTT_VERSION pipenv install --deploy --verbose \
-    && pipenv clean --verbose
+RUN pip install --no-cache-dir pipenv
+COPY --chown=nobody . $SOURCE_DIR_PATH
+ARG SWITCHBOT_MQTT_VERSION=
+RUN SETUPTOOLS_SCM_PRETEND_VERSION=$SWITCHBOT_MQTT_VERSION pipenv install --deploy --verbose
+
+# 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 \
+        glib \
+        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 {} \;
+#RUN apk add bluez-deprecated `# hcitool`
+
+USER nobody
 
-ENV PATH=$SOURCE_DIR_PATH/.venv/bin:$PATH
+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 ["switchbot-mqtt"]