This is an automated email from the ASF dual-hosted git repository.

hez pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git


The following commit(s) were added to refs/heads/main by this push:
     new 6a5fbf7a0 feat: make lake run with non-root users (#5583)
6a5fbf7a0 is described below

commit 6a5fbf7a08d0a9fffbae744ec7be0e7b094f90fc
Author: ZhangNing10 <[email protected]>
AuthorDate: Fri Jul 7 06:46:13 2023 +0800

    feat: make lake run with non-root users (#5583)
    
    * feat: make devlake run in nonroot user
    
    * feat: make devlake run as nonroot user and specify the user id
    
    * feat: make lake run with non-root user devlake whose home dir is /app
    
    * fix: adjust path
    
    * feat: support for debug builds and plugin-whitelisting in Dockerfile for 
easier troubleshooting
    
    ---------
    
    Co-authored-by: Keon Amini <[email protected]>
---
 Makefile                           |  3 ---
 backend/Dockerfile                 | 39 +++++++++++++++++++++++++-------------
 backend/Makefile                   | 37 ++++++++++++++++++++++++++++--------
 backend/impls/logruslog/stream.go  |  2 +-
 backend/scripts/compile-plugins.sh |  5 ++++-
 5 files changed, 60 insertions(+), 26 deletions(-)

diff --git a/Makefile b/Makefile
index 1ad172eb8..8d70432d4 100644
--- a/Makefile
+++ b/Makefile
@@ -71,9 +71,6 @@ swag:
 build-plugin:
        make build-plugin -C backend
 
-build-plugin-debug:
-       make build-plugin-debug -C backend
-
 build-worker:
        make build-worker -C backend
 
diff --git a/backend/Dockerfile b/backend/Dockerfile
index eef532cdf..f8532ba24 100644
--- a/backend/Dockerfile
+++ b/backend/Dockerfile
@@ -60,6 +60,7 @@ COPY --from=debian-arm64 /usr/include 
/rootfs-arm64/usr/include
 COPY --from=debian-arm64 /usr/lib/aarch64-linux-gnu 
/rootfs-arm64/usr/lib/aarch64-linux-gnu
 COPY --from=debian-arm64 /lib/aarch64-linux-gnu 
/rootfs-arm64/lib/aarch64-linux-gnu
 
+
 RUN for arch in aarch64 x86_64 ; do \
         mkdir -p /tmp/build/${arch} && cd /tmp/build/${arch} && \
         wget 
https://github.com/libgit2/libgit2/archive/refs/tags/v1.3.2.tar.gz -O - | tar 
-xz && \
@@ -87,6 +88,8 @@ ENV GOBIN=/app/bin
 ARG TARGETPLATFORM
 ARG TAG=
 ARG SHA=
+ARG GO_PLUGINS=
+ARG DEBUG=
 
 RUN --mount=type=cache,target=/root/.cache/go-build \
     if [ "$TARGETPLATFORM" = "linux/arm64" ] ; then \
@@ -100,7 +103,11 @@ RUN --mount=type=cache,target=/root/.cache/go-build \
     fi && \
     export PKG_CONFIG_PATH=/usr/local/deps/target/lib/pkgconfig && \
     export CGO_ENABLED=1 &&\
-    make all
+    PLUGIN="$GO_PLUGINS" make all
+
+RUN if [ "$DEBUG" = "true" ]; then \
+      go install github.com/go-delve/delve/cmd/dlv@latest; \
+    fi;
 
 # remove symlink in lib, we will recreate in final image
 RUN cd /usr/local/deps/target/lib && \
@@ -113,10 +120,8 @@ RUN cd /usr/local/deps/target/lib && \
 
 FROM python:3.9-slim-bullseye as base
 
-ENV PYTHONUNBUFFERED=1
-
 RUN apt-get update && \
-    apt-get install -y python3-dev python3-pip tar curl libssh2-1 zlib1g 
libffi-dev default-libmysqlclient-dev libpq-dev && \
+    apt-get install -y python3-dev python3-pip tar curl libssh2-1 zlib1g 
libffi-dev default-libmysqlclient-dev libpq-dev tini && \
     apt-get clean && \
     rm -fr /usr/share/doc/* \
            /usr/share/info/* \
@@ -132,26 +137,36 @@ RUN apt-get update && \
 
 EXPOSE 8080
 
+RUN useradd -ms /bin/bash -d /app devlake -u 1010
+USER devlake
+ENV PYTHONUNBUFFERED=1
+
 WORKDIR /app
+
+RUN mkdir logs
+VOLUME /app/logs
+
 # Setup Python
 COPY python/ /app/python/
 RUN python3 -m pip install --no-cache --upgrade pip setuptools && \
-    python3 -m pip install --no-cache -r python/requirements.txt && \
-    rm -fr /usr/share/python-wheels/*
+    python3 -m pip install --no-cache -r python/requirements.txt
+
 # Setup Python Poetry package manager
 RUN curl -sSL https://install.python-poetry.org | python3 -
-RUN ln -sf /root/.local/bin/poetry /usr/local/bin
-# Build Python plugins
-RUN find /app/python/ -name "*.sh" | xargs -I{} chmod +x {}
-RUN /app/python/build.sh
+ENV PATH="$PATH:/app/.local/bin"
 
+# Build Python plugins, make sure the scripts has execute permission
+# RUN find /app/python/ -name "*.sh" | xargs -I{} chmod +x {}
+RUN /app/python/build.sh
 
 FROM base as devlake-base
+ARG DEBUG=
 
 # libraries
 ENV LD_LIBRARY_PATH=/app/libs
 RUN mkdir -p /app/libs
 COPY --from=build /usr/local/deps/target/lib/*.so* /app/libs
+COPY --from=build /go/bin /usr/bin
 RUN ldconfig -vn /app/libs
 
 # apps
@@ -159,11 +174,9 @@ COPY --from=build /app/bin /app/bin
 COPY --from=build /app/resources /app/resources
 
 ENV PATH="/app/bin:${PATH}"
+ENV DEBUG="$DEBUG"
 
 #add tini, prevent zombie process
-RUN apt-get update && \
-    apt-get install -y tini
-
 ENTRYPOINT ["/usr/bin/tini", "--"]
 
 CMD ["lake"]
diff --git a/backend/Makefile b/backend/Makefile
index 38a18751a..c55a019f9 100644
--- a/backend/Makefile
+++ b/backend/Makefile
@@ -35,20 +35,41 @@ python-dep:
 dep: go-dep python-dep
 
 swag:
-       swag init --parseDependency --parseInternal -o ./server/api/docs -g 
./server/api/api.go -g ./plugins/*/api/*.go
-       @echo "visit the swagger document on 
http://localhost:8080/swagger/index.html";
+       if [ -z $(PLUGIN) ]; then \
+               swag init --parseDependency --parseInternal -o 
./server/api/docs -g ./server/api/api.go -g ./plugins/*/api/*.go; \
+       elif [ $(PLUGIN) = "none" ]; then \
+               swag init --parseDependency --parseInternal -o 
./server/api/docs -g ./server/api/api.go;\
+       else \
+               plugins="";\
+               for p in $$(echo $(PLUGIN) | tr "," "\n"); do \
+                       plugins="$$plugins -g ./plugins/$$p/api/*.go"; \
+               done;\
+               swag init --parseDependency --parseInternal -o 
./server/api/docs -g ./server/api/api.go "$$plugins"; \
+       fi;\
+       echo "visit the swagger document on 
http://localhost:8080/swagger/index.html";;
 
 build-plugin:
-       @sh scripts/compile-plugins.sh
-
-build-plugin-debug:
-       @sh scripts/compile-plugins.sh -gcflags='all=-N -l'
+       if [ "$(PLUGIN)" = "none" ]; then \
+               echo "Building plugins will be skipped"; \
+       elif [ "$(DEBUG)" = "true" ]; then \
+               PLUGIN=$(PLUGIN) sh scripts/compile-plugins.sh -gcflags='all=-N 
-l'; \
+       else \
+               PLUGIN=$(PLUGIN) sh scripts/compile-plugins.sh; \
+       fi
 
 build-worker:
-       go build -ldflags "-X 
'github.com/apache/incubator-devlake/core/version.Version=$(VERSION)'" -o 
bin/lake-worker ./worker/
+       if [ "$(DEBUG)" = "true" ]; then \
+               go build -gcflags='all=-N -l' -ldflags "-X 
'github.com/apache/incubator-devlake/core/version.Version=$(VERSION)'" -o 
bin/lake-worker ./worker/; \
+       else \
+               go build -ldflags "-X 
'github.com/apache/incubator-devlake/core/version.Version=$(VERSION)'" -o 
bin/lake-worker ./worker/; \
+       fi
 
 build-server: swag
-       go build -ldflags "-X 
'github.com/apache/incubator-devlake/core/version.Version=$(VERSION)'" -o 
bin/lake ./server/
+       if [ "$(DEBUG)" = "true" ]; then \
+               go build -gcflags='all=-N -l' -ldflags "-X 
'github.com/apache/incubator-devlake/core/version.Version=$(VERSION)'" -o 
bin/lake ./server/; \
+       else \
+               go build -ldflags "-X 
'github.com/apache/incubator-devlake/core/version.Version=$(VERSION)'" -o 
bin/lake ./server/; \
+       fi
 
 build-python: #don't mix this with the other build commands
        find ./python/ -name "*.sh" | xargs chmod +x &&\
diff --git a/backend/impls/logruslog/stream.go 
b/backend/impls/logruslog/stream.go
index 69f529531..d5429e19b 100644
--- a/backend/impls/logruslog/stream.go
+++ b/backend/impls/logruslog/stream.go
@@ -28,7 +28,7 @@ func GetFileStream(path string) (io.Writer, errors.Error) {
        if path == "" {
                return os.Stdout, nil
        }
-       err := os.MkdirAll(filepath.Dir(path), os.ModePerm)
+       err := os.MkdirAll(filepath.Dir(path), 0777)
        if err != nil {
                return nil, errors.Convert(err)
        }
diff --git a/backend/scripts/compile-plugins.sh 
b/backend/scripts/compile-plugins.sh
index 9b4d7fd4f..4ee940d3f 100644
--- a/backend/scripts/compile-plugins.sh
+++ b/backend/scripts/compile-plugins.sh
@@ -38,9 +38,12 @@ SCRIPT_DIR="$( cd "$( dirname "$0" )" && pwd )"
 PLUGIN_SRC_DIR=$SCRIPT_DIR/../plugins
 PLUGIN_OUTPUT_DIR=$SCRIPT_DIR/../bin/plugins
 
+
 if [ -z "$PLUGIN" ]; then
+    echo "Building all plugins"
     PLUGINS=$(find $PLUGIN_SRC_DIR/* -maxdepth 0 -type d -not -name core -not 
-name helper -not -name logs -not -empty)
 else
+    echo "Building the following plugins: $PLUGIN"
     PLUGINS=
     for p in $(echo "$PLUGIN" | tr "," "\n"); do
         PLUGINS="$PLUGINS $PLUGIN_SRC_DIR/$p"
@@ -52,7 +55,7 @@ rm -rf $PLUGIN_OUTPUT_DIR/*
 PIDS=""
 for PLUG in $PLUGINS; do
     NAME=$(basename $PLUG)
-    echo "Building plugin $NAME to bin/plugins/$NAME/$NAME.so"
+    echo "Building plugin $NAME to bin/plugins/$NAME/$NAME.so with args: $*"
     go build -buildmode=plugin "$@" -o $PLUGIN_OUTPUT_DIR/$NAME/$NAME.so 
$PLUG/*.go &
     PIDS="$PIDS $!"
     # avoid too many processes causing signal killed

Reply via email to