From b50756dbcb6c9ba3176dabda99a769e1ac756e5a Mon Sep 17 00:00:00 2001 From: vvisionnn <0xEFEFEF@gmail.com> Date: Mon, 11 Apr 2022 22:13:33 +0800 Subject: [PATCH] feat: docker/docker-compose support (#1203) * Feat: add official Dockerfile * Feat: add dev docker build actions * update github actions for docker * update docker actions * update docker actions * update docker actions * update docker actions * update docker actions * update docker actions * fix: add npm default registry * fix: remove yarn.lock * fix: update frontend checksum * remove set registry * update Dockerfile * feat: basic docker-compose solution * remove old Dockerfile * fix typo * fix: frontend version * fix: remove unused comments --- .github/workflows/docker-release.yml | 50 +++++++++++++++++ Dockerfile | 81 ++++++++++------------------ docker-compose.yml | 33 ++++++++++++ 3 files changed, 110 insertions(+), 54 deletions(-) create mode 100644 .github/workflows/docker-release.yml create mode 100644 docker-compose.yml diff --git a/.github/workflows/docker-release.yml b/.github/workflows/docker-release.yml new file mode 100644 index 0000000..6c49210 --- /dev/null +++ b/.github/workflows/docker-release.yml @@ -0,0 +1,50 @@ +name: Build and push docker image + +on: + push: + tags: + - 3.* # triggered on every push with tag 3.* + workflow_dispatch: # or just on button clicked + +jobs: + docker-build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - run: git fetch --prune --unshallow + - name: Setup Environments + id: envs + run: | + CLOUDREVE_LATEST_TAG=$(git describe --tags --abbrev=0) + DOCKER_IMAGE="cloudreve/cloudreve" + + echo "RELEASE_VERSION=${GITHUB_REF#refs}" + TAGS="${DOCKER_IMAGE}:latest,${DOCKER_IMAGE}:${CLOUDREVE_LATEST_TAG}" + + echo "CLOUDREVE_LATEST_TAG:${CLOUDREVE_LATEST_TAG}" + echo ::set-output name=tags::${TAGS} + - name: Setup QEMU Emulator + uses: docker/setup-qemu-action@master + with: + platforms: all + - name: Setup Docker Buildx Command + id: buildx + uses: docker/setup-buildx-action@master + - name: Login to Dockerhub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + - name: Build Docker Image and Push + id: docker_build + uses: docker/build-push-action@v2 + with: + push: true + builder: ${{ steps.buildx.outputs.name }} + context: . + file: ./Dockerfile + platforms: linux/amd64,linux/arm64,linux/arm/v7 + tags: ${{ steps.envs.outputs.tags }} + - name: Image Digest + run: echo ${{ steps.docker_build.outputs.digest }} diff --git a/Dockerfile b/Dockerfile index e99d32a..0f8edf4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,70 +1,43 @@ -# build frontend -FROM node:lts-buster AS fe-builder +FROM golang:1.17.7-alpine as cloudreve_builder -COPY ./assets /assets -WORKDIR /assets +# install dependencies and build tools +RUN apk update && apk add --no-cache wget curl git yarn build-base gcc abuild binutils binutils-doc gcc-doc -# If encountered problems like JavaScript heap out of memory, please uncomment the following options -ENV NODE_OPTIONS --max_old_space_size=4096 +WORKDIR /cloudreve_builder +RUN git clone --recurse-submodules https://github.com/cloudreve/Cloudreve.git -# yarn repo connection is unstable, adjust the network timeout to 10 min. -RUN set -ex \ - && yarn install --network-timeout 600000 \ - && yarn run build +# build frontend +WORKDIR /cloudreve_builder/Cloudreve/assets +RUN yarn install --network-timeout 1000000 +RUN yarn run build # build backend -FROM golang:1.17.7-alpine3.12 AS be-builder - -ENV GO111MODULE on - -COPY . /go/src/github.com/cloudreve/Cloudreve/v3 -COPY --from=fe-builder /assets/build/ /go/src/github.com/cloudreve/Cloudreve/v3/assets/build/ - -WORKDIR /go/src/github.com/cloudreve/Cloudreve/v3 - -RUN set -ex \ - && apk upgrade \ - && apk add gcc libc-dev git \ +WORKDIR /cloudreve_builder/Cloudreve +RUN go get github.com/rakyll/statik \ + && statik -src=assets/build/ -include=*.html,*.js,*.json,*.css,*.png,*.svg,*.ico -f \ + && tag_name=$(git describe --tags) \ && export COMMIT_SHA=$(git rev-parse --short HEAD) \ - && export VERSION=$(git describe --tags) \ - && go install -ldflags "-X 'github.com/cloudreve/Cloudreve/v3/pkg/conf.BackendVersion=${VERSION}' \ - -X 'github.com/cloudreve/Cloudreve/v3/pkg/conf.LastCommit=${COMMIT_SHA}'\ - -w -s" - -# build final image -FROM alpine:3.12 AS dist + && go build -a -o cloudreve -ldflags " -X 'github.com/HFO4/cloudreve/pkg/conf.BackendVersion=$tag_name' -X 'github.com/HFO4/cloudreve/pkg/conf.LastCommit=$COMMIT_SHA'" -LABEL maintainer="mritd " -# we use the Asia/Shanghai timezone by default, you can be modified -# by `docker build --build-arg=TZ=Other_Timezone ...` -ARG TZ="Asia/Shanghai" +# build final image +FROM alpine:latest -ENV TZ ${TZ} +WORKDIR /cloudreve -COPY --from=be-builder /go/bin/Cloudreve /cloudreve/cloudreve -COPY docker-bootstrap.sh /cloudreve/bootstrap.sh +RUN apk update && apk add --no-cache tzdata -RUN apk upgrade \ - && apk add bash tzdata aria2 \ - && ln -s /cloudreve/cloudreve /usr/bin/cloudreve \ - && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \ - && echo ${TZ} > /etc/timezone \ - && rm -rf /var/cache/apk/* \ - && mkdir /etc/cloudreve \ - && ln -s /etc/cloudreve/cloureve.db /cloudreve/cloudreve.db \ - && ln -s /etc/cloudreve/conf.ini /cloudreve/conf.ini +# we using the `Asia/Shanghai` timezone by default, you can do modification at your will +RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ + && echo "Asia/Shanghai" > /etc/timezone -# cloudreve use tcp 5212 port by default -EXPOSE 5212/tcp +COPY --from=cloudreve_builder /cloudreve_builder/Cloudreve/cloudreve ./ -# cloudreve stores all files(including executable file) in the `/cloudreve` -# directory by default; users should mount the configfile to the `/etc/cloudreve` -# directory by themselves for persistence considerations, and the data storage -# directory recommends using `/data` directory. -VOLUME /etc/cloudreve +# prepare permissions and aria2 dir +RUN chmod +x ./cloudreve && mkdir -p /data/aria2 && chmod -R 766 /data/aria2 -VOLUME /data +EXPOSE 5212 +VOLUME ["/cloudreve/uploads", "/cloudreve/avatar", "/data"] -ENTRYPOINT ["sh", "/cloudreve/bootstrap.sh"] +ENTRYPOINT ["./cloudreve"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..ec3a457 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,33 @@ +version: "3.8" +services: + cloudreve: + container_name: cloudreve + image: cloudreve/cloudreve:latest + restart: unless-stopped + ports: + - "5212:5212" + volumes: + - temp_data:/data + - ./cloudreve/uploads:/cloudreve/uploads + - ./cloudreve/conf.ini:/cloudreve/conf.ini + - ./cloudreve/cloudreve.db:/cloudreve/cloudreve.db + - ./cloudreve/avatar:/cloudreve/avatar + depends_on: + - aria2 + aria2: + container_name: aria2 + image: p3terx/aria2-pro # third party image, please keep notice what you are doing + restart: unless-stopped + environment: + - RPC_SECRET=your_aria_rpc_token # aria rpc token, customize your own + - RPC_PORT=6800 + volumes: + - ./aria2/config:/config + - temp_data:/data +volumes: + temp_data: + driver: local + driver_opts: + type: none + device: $PWD/data + o: bind \ No newline at end of file