Browse Source

Docker: add Debian based image

Nicola Murino 4 years ago
parent
commit
d126c5736a
3 changed files with 105 additions and 17 deletions
  1. 22 4
      .github/workflows/docker.yml
  2. 8 13
      Dockerfile
  3. 75 0
      Dockerfile.alpine

+ 22 - 4
.github/workflows/docker.yml

@@ -2,7 +2,7 @@ name: Docker
 
 
 on:
 on:
   schedule:
   schedule:
-    - cron: '0 4 * * *' # everyday at 4 am UTC
+    - cron: '0 4 * * *' # everyday at 4:00 AM UTC
   push:
   push:
     branches:
     branches:
       - master
       - master
@@ -13,7 +13,12 @@ on:
 jobs:
 jobs:
   build:
   build:
     name: Build
     name: Build
-    runs-on: ubuntu-latest
+    runs-on: ${{ matrix.os }}
+    strategy:
+      matrix:
+        os:
+          - ubuntu-latest
+        docker_pkg: [debian, alpine]
     steps:
     steps:
       - name: Checkout
       - name: Checkout
         uses: actions/checkout@v2
         uses: actions/checkout@v2
@@ -31,6 +36,7 @@ jobs:
         run: |
         run: |
           DOCKER_IMAGE=ghcr.io/drakkan/sftpgo
           DOCKER_IMAGE=ghcr.io/drakkan/sftpgo
           VERSION=noop
           VERSION=noop
+          DOCKERFILE=Dockerfile
           if [ "${{ github.event_name }}" = "schedule" ]; then
           if [ "${{ github.event_name }}" = "schedule" ]; then
             VERSION=nightly
             VERSION=nightly
           elif [[ $GITHUB_REF == refs/tags/* ]]; then
           elif [[ $GITHUB_REF == refs/tags/* ]]; then
@@ -43,14 +49,25 @@ jobs:
           elif [[ $GITHUB_REF == refs/pull/* ]]; then
           elif [[ $GITHUB_REF == refs/pull/* ]]; then
             VERSION=pr-${{ github.event.number }}
             VERSION=pr-${{ github.event.number }}
           fi
           fi
+          if [[ $DOCKER_PKG == alpine ]]; then
+            VERSION="$VERSION-alpine"
+            DOCKERFILE=Dockerfile.alpine
+          fi
           TAGS="${DOCKER_IMAGE}:${VERSION}"
           TAGS="${DOCKER_IMAGE}:${VERSION}"
           if [[ $GITHUB_REF == refs/tags/* ]]; then
           if [[ $GITHUB_REF == refs/tags/* ]]; then
-            TAGS="$TAGS,${DOCKER_IMAGE}:latest"
+            if [[ $DOCKER_PKG == debian ]]; then
+              TAGS="$TAGS,${DOCKER_IMAGE}:latest"
+            else
+              TAGS="$TAGS,${DOCKER_IMAGE}:alpine"
+            fi
           fi
           fi
+          echo ::set-output name=dockerfile::${DOCKERFILE}
           echo ::set-output name=version::${VERSION}
           echo ::set-output name=version::${VERSION}
           echo ::set-output name=tags::${TAGS}
           echo ::set-output name=tags::${TAGS}
           echo ::set-output name=created::$(date -u +'%Y-%m-%dT%H:%M:%SZ')
           echo ::set-output name=created::$(date -u +'%Y-%m-%dT%H:%M:%SZ')
           echo ::set-output name=sha::${GITHUB_SHA::8}
           echo ::set-output name=sha::${GITHUB_SHA::8}
+        env:
+          DOCKER_PKG: ${{ matrix.docker_pkg }}
 
 
       - name: Set up QEMU
       - name: Set up QEMU
         uses: docker/setup-qemu-action@v1
         uses: docker/setup-qemu-action@v1
@@ -69,11 +86,12 @@ jobs:
       - name: Build and push
       - name: Build and push
         uses: docker/build-push-action@v2
         uses: docker/build-push-action@v2
         with:
         with:
+          file: ./${{ steps.info.outputs.dockerfile }}
+          platforms: linux/amd64,linux/arm64
           push: ${{ github.event_name != 'pull_request' }}
           push: ${{ github.event_name != 'pull_request' }}
           tags: ${{ steps.info.outputs.tags }}
           tags: ${{ steps.info.outputs.tags }}
           build-args: |
           build-args: |
             COMMIT_SHA=${{ steps.info.outputs.sha }}
             COMMIT_SHA=${{ steps.info.outputs.sha }}
-          platforms: linux/amd64,linux/arm64
           labels: |
           labels: |
             org.opencontainers.image.title=${{ fromJson(steps.repo.outputs.result).name }}
             org.opencontainers.image.title=${{ fromJson(steps.repo.outputs.result).name }}
             org.opencontainers.image.description=Fully featured and highly configurable SFTP server with optional FTP/S and WebDAV support
             org.opencontainers.image.description=Fully featured and highly configurable SFTP server with optional FTP/S and WebDAV support

+ 8 - 13
Dockerfile

@@ -1,9 +1,7 @@
-FROM golang:1.15-alpine AS builder
+FROM golang:1.15 as builder
 
 
 ENV GOFLAGS="-mod=readonly"
 ENV GOFLAGS="-mod=readonly"
 
 
-RUN apk add --update --no-cache bash ca-certificates curl git gcc g++
-
 RUN mkdir -p /workspace
 RUN mkdir -p /workspace
 WORKDIR /workspace
 WORKDIR /workspace
 
 
@@ -25,24 +23,21 @@ RUN set -xe && \
     export COMMIT_SHA=${COMMIT_SHA:-$(git describe --always --dirty)} && \
     export COMMIT_SHA=${COMMIT_SHA:-$(git describe --always --dirty)} && \
     go build $(if [ -n "${FEATURES}" ]; then echo "-tags ${FEATURES}"; fi) -ldflags "-s -w -X github.com/drakkan/sftpgo/version.commit=${COMMIT_SHA} -X github.com/drakkan/sftpgo/version.date=`date -u +%FT%TZ`" -v -o sftpgo
     go build $(if [ -n "${FEATURES}" ]; then echo "-tags ${FEATURES}"; fi) -ldflags "-s -w -X github.com/drakkan/sftpgo/version.commit=${COMMIT_SHA} -X github.com/drakkan/sftpgo/version.date=`date -u +%FT%TZ`" -v -o sftpgo
 
 
+FROM debian:buster-slim
 
 
-FROM alpine:3.12
-
-RUN apk add --update --no-cache ca-certificates tzdata bash mailcap
+RUN apt-get update && apt-get install --no-install-recommends -y ca-certificates mime-support && apt-get clean
 
 
 SHELL ["/bin/bash", "-c"]
 SHELL ["/bin/bash", "-c"]
 
 
-# set up nsswitch.conf for Go's "netgo" implementation
-# https://github.com/gliderlabs/docker-alpine/issues/367#issuecomment-424546457
-RUN test ! -e /etc/nsswitch.conf && echo 'hosts: files dns' > /etc/nsswitch.conf
-
 RUN mkdir -p /etc/sftpgo /var/lib/sftpgo /usr/share/sftpgo
 RUN mkdir -p /etc/sftpgo /var/lib/sftpgo /usr/share/sftpgo
 
 
-RUN addgroup -g 1000 -S sftpgo
-RUN adduser -u 1000 -h /var/lib/sftpgo -s /sbin/nologin -G sftpgo -S -D -H sftpgo
+RUN groupadd --system -g 1000 sftpgo
+RUN useradd --system --gid sftpgo --no-create-home \
+    --home-dir /var/lib/sftpgo --shell /usr/sbin/nologin \
+    --comment "SFTPGo user" --uid 1000 sftpgo
 
 
 # Install some optional packages used by SFTPGo features
 # Install some optional packages used by SFTPGo features
-RUN apk add --update --no-cache rsync git
+RUN apt-get update && apt-get install --no-install-recommends -y git rsync && apt-get clean
 
 
 # Override some configuration details
 # Override some configuration details
 ENV SFTPGO_CONFIG_DIR=/etc/sftpgo
 ENV SFTPGO_CONFIG_DIR=/etc/sftpgo

+ 75 - 0
Dockerfile.alpine

@@ -0,0 +1,75 @@
+FROM golang:1.15-alpine AS builder
+
+ENV GOFLAGS="-mod=readonly"
+
+RUN apk add --update --no-cache bash ca-certificates curl git gcc g++
+
+RUN mkdir -p /workspace
+WORKDIR /workspace
+
+ARG GOPROXY
+
+COPY go.mod go.sum ./
+RUN go mod download
+
+ARG COMMIT_SHA
+
+# This ARG allows to disable some optional features and it might be useful if you build the image yourself.
+# For example you can disable S3 and GCS support like this:
+# --build-arg FEATURES=nos3,nogcs
+ARG FEATURES
+
+COPY . .
+
+RUN set -xe && \
+    export COMMIT_SHA=${COMMIT_SHA:-$(git describe --always --dirty)} && \
+    go build $(if [ -n "${FEATURES}" ]; then echo "-tags ${FEATURES}"; fi) -ldflags "-s -w -X github.com/drakkan/sftpgo/version.commit=${COMMIT_SHA} -X github.com/drakkan/sftpgo/version.date=`date -u +%FT%TZ`" -v -o sftpgo
+
+
+FROM alpine:3.12
+
+RUN apk add --update --no-cache ca-certificates tzdata bash mailcap
+
+SHELL ["/bin/bash", "-c"]
+
+# set up nsswitch.conf for Go's "netgo" implementation
+# https://github.com/gliderlabs/docker-alpine/issues/367#issuecomment-424546457
+RUN test ! -e /etc/nsswitch.conf && echo 'hosts: files dns' > /etc/nsswitch.conf
+
+RUN mkdir -p /etc/sftpgo /var/lib/sftpgo /usr/share/sftpgo
+
+RUN addgroup -g 1000 -S sftpgo
+RUN adduser -u 1000 -h /var/lib/sftpgo -s /sbin/nologin -G sftpgo -S -D -H sftpgo
+
+# Install some optional packages used by SFTPGo features
+RUN apk add --update --no-cache rsync git
+
+# Override some configuration details
+ENV SFTPGO_CONFIG_DIR=/etc/sftpgo
+ENV SFTPGO_LOG_FILE_PATH=""
+ENV SFTPGO_HTTPD__TEMPLATES_PATH=/usr/share/sftpgo/templates
+ENV SFTPGO_HTTPD__STATIC_FILES_PATH=/usr/share/sftpgo/static
+
+# Sane defaults, but users should still be able to override this from env vars
+ENV SFTPGO_DATA_PROVIDER__USERS_BASE_DIR=/var/lib/sftpgo/users
+ENV SFTPGO_DATA_PROVIDER__CREDENTIALS_PATH=/var/lib/sftpgo/credentials
+ENV SFTPGO_HTTPD__BACKUPS_PATH=/var/lib/sftpgo/backups
+ENV SFTPGO_SFTPD__HOST_KEYS=/var/lib/sftpgo/host_keys/id_rsa,/var/lib/sftpgo/host_keys/id_ecdsa
+ENV SFTPGO_HTTPD__BIND_ADDRESS=""
+
+COPY --from=builder /workspace/sftpgo.json /etc/sftpgo/sftpgo.json
+COPY --from=builder /workspace/templates /usr/share/sftpgo/templates
+COPY --from=builder /workspace/static /usr/share/sftpgo/static
+COPY --from=builder /workspace/sftpgo /usr/local/bin/
+
+RUN sed -i "s|sftpgo.db|/var/lib/sftpgo/sftpgo.db|" /etc/sftpgo/sftpgo.json
+
+RUN chown -R sftpgo:sftpgo /etc/sftpgo && chown sftpgo:sftpgo /var/lib/sftpgo && \
+    chmod 640 /etc/sftpgo/sftpgo.json && \
+    chmod 750 /etc/sftpgo /var/lib/sftpgo
+
+USER sftpgo
+
+VOLUME /var/lib/sftpgo
+
+CMD sftpgo serve