1
Fork 0

Use alpine as base images. (#1033)

This commit is contained in:
Googol Lee 2024-09-02 18:35:45 +02:00 committed by GitHub
parent ad13172a32
commit 85c1e52b06
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 47 additions and 187 deletions

View File

@ -1,14 +1,15 @@
name: Docker builds
on:
pull_request:
branches: [master]
push:
branches: [master]
tags:
- v*
pull_request:
branches: [master]
env:
IS_PUSHING_IMAGES: ${{ github.event_name != 'pull_request' && github.repository == 'photoview/photoview' }}
DOCKER_USERNAME: viktorstrate
DOCKER_IMAGE: viktorstrate/photoview
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
@ -20,9 +21,6 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Delete huge unnecessary tools folder
run: rm -rf /opt/hostedtoolcache
- name: Checkout
uses: actions/checkout@v4
@ -36,7 +34,7 @@ jobs:
uses: docker/setup-buildx-action@v3
- name: Docker Login
if: success() && github.event_name != 'pull_request' && github.repository == 'photoview/photoview'
if: ${{ env.IS_PUSHING_IMAGES == 'true' }}
uses: docker/login-action@v3
with:
username: ${{ env.DOCKER_USERNAME }}
@ -64,7 +62,7 @@ jobs:
context: .
platforms: ${{ env.PLATFORMS }}
pull: true
push: ${{ github.event_name != 'pull_request' && github.repository == 'photoview/photoview' }}
push: ${{ env.IS_PUSHING_IMAGES }}
tags: ${{ steps.docker_meta.outputs.tags }}
labels: ${{ steps.docker_meta.outputs.labels }}
cache-from: type=gha

View File

@ -1,8 +1,8 @@
### Build UI ###
FROM --platform=${BUILDPLATFORM:-linux/amd64} node:18 AS ui
FROM --platform=${BUILDPLATFORM:-linux/amd64} node:18-alpine AS ui
# See for details: https://github.com/hadolint/hadolint/wiki/DL4006
SHELL ["/bin/bash", "-euo", "pipefail", "-c"]
SHELL ["/bin/sh", "-euo", "pipefail", "-c"]
ARG REACT_APP_API_ENDPOINT
ENV REACT_APP_API_ENDPOINT=${REACT_APP_API_ENDPOINT}
@ -36,11 +36,11 @@ RUN if [ "${BUILD_DATE}" = "undefined" ]; then \
npm run build -- --base=$UI_PUBLIC_URL
### Build API ###
FROM --platform=${BUILDPLATFORM:-linux/amd64} golang:1.22-bookworm AS api
FROM --platform=${BUILDPLATFORM:-linux/amd64} golang:1.22-alpine AS api
ARG TARGETPLATFORM
# See for details: https://github.com/hadolint/hadolint/wiki/DL4006
SHELL ["/bin/bash", "-euo", "pipefail", "-c"]
SHELL ["/bin/sh", "-euo", "pipefail", "-c"]
WORKDIR /app/api
@ -49,43 +49,41 @@ ENV PATH="${GOPATH}/bin:${PATH}"
ENV CGO_ENABLED=1
# Download dependencies
COPY scripts/apt/debian-testing.sources /etc/apt/sources.list.d/
COPY scripts/set_compiler_env.sh /app/scripts/
COPY scripts/install_build_dependencies.sh /app/scripts/
COPY scripts/install_runtime_dependencies.sh /app/scripts/
RUN chmod +x /app/scripts/*.sh \
&& /app/scripts/install_build_dependencies.sh \
&& mv $(go env GOPATH)/bin/reflex /usr/bin/ \
&& /app/scripts/install_runtime_dependencies.sh
COPY api/go.mod api/go.sum /app/api/
RUN source /app/scripts/set_compiler_env.sh \
&& go env \
RUN go env \
&& go mod download \
# Patch go-face
&& sed -i 's/-march=native//g' ${GOPATH}/pkg/mod/github.com/!kagami/go-face*/face.go \
# Build dependencies that use CGO
&& go install \
github.com/mattn/go-sqlite3 \
github.com/Kagami/go-face
&& go install github.com/mattn/go-sqlite3 github.com/Kagami/go-face
COPY api /app/api
RUN source /app/scripts/set_compiler_env.sh \
&& go build -v -o photoview .
RUN go build -v -o photoview .
### Build release image ###
FROM --platform=${BUILDPLATFORM:-linux/amd64} debian:testing-slim AS release
FROM --platform=${BUILDPLATFORM:-linux/amd64} alpine:latest AS release
ARG TARGETPLATFORM
# See for details: https://github.com/hadolint/hadolint/wiki/DL4006
SHELL ["/bin/bash", "-euo", "pipefail", "-c"]
SHELL ["/bin/sh", "-euo", "pipefail", "-c"]
COPY scripts/install_runtime_dependencies.sh /app/scripts/
RUN chmod +x /app/scripts/install_runtime_dependencies.sh \
# Create a user to run Photoview server
&& groupadd -g 999 photoview \
&& useradd -r -u 999 -g photoview -m photoview \
&& addgroup -g 9999 photoview \
&& adduser -u 9999 -G photoview -D photoview \
# Required dependencies
&& /app/scripts/install_runtime_dependencies.sh
&& /app/scripts/install_runtime_dependencies.sh \
# Remove build dependencies and cleanup
&& apk cache clean \
&& rm -rf /var/cache/apk/*
WORKDIR /home/photoview

View File

@ -107,10 +107,12 @@ All the photo galleries can do a lot of what I need, but no single one can do it
If command(s) return `Permission denied` error, run them under the user, owning corresponding files and folders. Alternatively, run them adding `sudo ` before the command: this will switch the execution context to `root` user and ask for the root password. You have to have permission to run `sudo` in the system.
NOTE: GID and UID was changed to 9999. If it's different from your local files, please update your files.
If you don't want to give required permissions to `others` group for your files, alternatively, you can:
- create a group on your host with GID=999 and make all the files and folders inside volumes of the `photoview` service being owned by this group; then set the appropriate permissions to the `group` section.
- create on your host a group with GID=999 and a user in this group with UID=999; then change the ownership of all the files and folders inside volumes of the `photoview` service to this user; then set the appropriate permissions to the `user` section.
- create a group on your host with GID=9999 and make all the files and folders inside volumes of the `photoview` service being owned by this group; then set the appropriate permissions to the `group` section.
- create on your host a group with GID=9999 and a user in this group with UID=9999; then change the ownership of all the files and folders inside volumes of the `photoview` service to this user; then set the appropriate permissions to the `user` section.
If you configured other mounts with media files from other locations on the host (like HOST_PHOTOVIEW_MEDIA_FAMILY or anything else), you need to run the same commands, as in the `Makefile` `readable` target, for each media root folder on your host manually: copy each command to your shell and replace the variable with the absolute path to an additional media root folder without the trailing `/`. Run both commands for each additional root folder.
5. In case, you don't have `make` installed in your system or don't want to use it for the Photoview management activities, you could use the same commands from the `Makefile` and run them in your shell directly, or create your own scripts. Make sure to apply or replace the variables from your `.env` first in this case. `Makefile` is provided just for your convenience and simplicity, but is optional.
@ -233,8 +235,13 @@ The site can now be accessed at [localhost:1234](http://localhost:1234).
## Set up local development environment
In Linux, we recommend to use [Docker Compose or Docker](https://github.com/googollee/photoview?tab=readme-ov-file#set-up-docker-development-environment) as a local development environment.
We can't keep verifying below commands on each environment. People may need to solve dependencies by their own.
### Install dependencies
- API
- Required packages:
- `golang` >= 1.22
@ -245,7 +252,7 @@ The site can now be accessed at [localhost:1234](http://localhost:1234).
- `dlib`
- `libjpeg`
- `libblas`
- `libcblas`, recommended using `libatlas-base`
- `libcblas`, recommended using `libatlas-base` in Debian.
- `liblapack`
- Optional tools during developing:
- [`reflex`](https://github.com/cespare/reflex): a source code monitoring tool, which automatically rebuilds and restarts the server, running from the code in development.
@ -297,8 +304,6 @@ You can install `node` with other package manager if you like.
Then run the following commands:
```bash
# Optional: Set the compiler environment in Debian/Ubuntu
$ source ./scripts/set_compiler_env.sh
# Set the compiler environment with `homebrew`
$ export CPLUS_INCLUDE_PATH="$(brew --prefix)/opt/jpeg/include:$(brew --prefix)/opt/dlib/include"
$ export LD_LIBRARY_PATH="$(brew --prefix)/opt/jpeg/lib:$(brew --prefix)/opt/dlib/lib"

View File

@ -13,7 +13,7 @@ services:
ports:
- 1234:1234
command:
- /bin/bash
- /bin/sh
- -c
- |
npm ci
@ -36,10 +36,9 @@ services:
ports:
- 4001:4001
command:
- /bin/bash
- /bin/sh
- -c
- |
source /app/scripts/set_compiler_env.sh
reflex -g '*.go' -s -- go run .
mariadb:

View File

@ -1,13 +0,0 @@
Types: deb
# http://snapshot.debian.org/archive/debian/20240722T000000Z
URIs: http://deb.debian.org/debian
Suites: testing testing-updates
Components: main
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
Types: deb
# http://snapshot.debian.org/archive/debian-security/20240722T000000Z
URIs: http://deb.debian.org/debian-security
Suites: testing-security
Components: main
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

View File

@ -1,11 +0,0 @@
Package: *
Pin: release n=bookworm
Pin-Priority: 700
Package: *
Pin: release n=bookworm-updates
Pin-Priority: 700
Package: *
Pin: release n=bookworm-security
Pin-Priority: 700

View File

@ -1,42 +1,11 @@
#!/bin/bash
#!/bin/sh
set -euo pipefail
if [ "$TARGETPLATFORM" == "linux/arm64" ]; then
dpkg --add-architecture arm64
DEBIAN_ARCH='arm64'
elif [ "$TARGETPLATFORM" == "linux/arm/v6" ] || [ "$TARGETPLATFORM" == "linux/arm/v7" ]; then
dpkg --add-architecture armhf
DEBIAN_ARCH='armhf'
else
dpkg --add-architecture amd64
DEBIAN_ARCH='amd64'
fi
apk update
apt-get update
# Install G++/GCC cross compilers
if [ "$DEBIAN_ARCH" == "arm64" ]; then
apt-get install -y \
g++-aarch64-linux-gnu \
libc6-dev-arm64-cross
elif [ "$DEBIAN_ARCH" == "armhf" ]; then
apt-get install -y \
g++-arm-linux-gnueabihf \
libc6-dev-armhf-cross
else
apt-get install -y \
g++-x86-64-linux-gnu \
libc6-dev-amd64-cross
fi
# Install go-face dependencies and libheif for HEIF media decoding
apt-get install -y \
libdlib-dev:${DEBIAN_ARCH} \
libblas-dev:${DEBIAN_ARCH} \
libatlas-base-dev:${DEBIAN_ARCH} \
liblapack-dev:${DEBIAN_ARCH} \
libjpeg-dev:${DEBIAN_ARCH} \
libheif-dev:${DEBIAN_ARCH}
apk add go g++ blas-dev cblas lapack-dev jpeg-dev libheif-dev
apk add dlib-dev --repository=https://dl-cdn.alpinelinux.org/alpine/edge/testing
# Install tools for development
apt-get install -y reflex sqlite3
apk add sqlite
go install github.com/cespare/reflex@latest

View File

@ -1,10 +1,9 @@
#!/bin/bash
#!/bin/sh
set -euo pipefail
apt-get update
apt-get install -y curl libdlib19.2 ffmpeg exiftool libheif1 imagemagick
apk update
# Remove build dependencies and cleanup
apt-get autoremove -y
apt-get clean
rm -rf /var/lib/apt/lists/*
apk add curl libheif lapack cblas exiftool
apk add ffmpeg ffmpeg-libs ffmpeg-libavcodec ffmpeg-libavformat
apk add imagemagick imagemagick-libs imagemagick-heic imagemagick-jpeg imagemagick-raw imagemagick-tiff imagemagick-webp imagemagick-svg imagemagick-jxl
apk add dlib --repository=https://dl-cdn.alpinelinux.org/alpine/edge/testing

View File

@ -1,84 +0,0 @@
#!/bin/sh
# Script to configure environment variables for Go compiler
# to allow cross compilation
: ${TARGETPLATFORM=}
: ${TARGETOS=}
: ${TARGETARCH=}
: ${TARGETVARIANT=}
CGO_ENABLED="$(go env CGO_ENABLED)"
GOARCH="$(go env GOARCH)"
GOOS="$(go env GOOS)"
GOARM="$(go env GOARM)"
GOBIN="$(go env GOBIN)"
set -eu
if [ ! -z "$TARGETPLATFORM" ]; then
TARGETOS="$(echo $TARGETPLATFORM | cut -d"/" -f1)"
TARGETARCH="$(echo $TARGETPLATFORM | cut -d"/" -f2)"
TARGETVARIANT="$(echo $TARGETPLATFORM | cut -d"/" -f3)"
fi
if [ ! -z "$TARGETOS" ]; then
export GOOS="$TARGETOS"
fi
if [ ! -z "$TARGETARCH" ]; then
export GOARCH="$TARGETARCH"
fi
if [ "$TARGETARCH" = "arm" ]; then
if [ ! -z "$TARGETVARIANT" ]; then
case "$TARGETVARIANT" in
"v5")
export GOARM="5"
;;
"v6")
export GOARM="6"
;;
*)
export GOARM="7"
;;
esac
else
export GOARM="7"
fi
fi
if [ "$CGO_ENABLED" = "1" ]; then
case "$GOARCH" in
"amd64")
export COMPILER_ARCH="x86_64-linux-gnu"
;;
"ppc64le")
export COMPILER_ARCH="powerpc64le-linux-gnu"
;;
"s390x")
export COMPILER_ARCH="s390x-linux-gnu"
;;
"arm64")
export COMPILER_ARCH="aarch64-linux-gnu"
;;
"arm")
case "$GOARM" in
"5")
export COMPILER_ARCH="arm-linux-gnueabi"
;;
*)
export COMPILER_ARCH="arm-linux-gnueabihf"
;;
esac
;;
esac
fi
export CC="${COMPILER_ARCH}-gcc"
export CXX="${COMPILER_ARCH}-g++"
export PKG_CONFIG_PATH="/usr/lib/${COMPILER_ARCH}/pkgconfig/"
if [ -z "$GOBIN" ] && [ -n "$GOPATH" ] && [ -n "$GOARCH" ] && [ -n "$GOOS" ]; then
export PATH=${GOPATH}/bin/${GOOS}_${GOARCH}:${PATH}
fi