mirror of
https://github.com/photoprism/photoprism.git
synced 2025-10-05 16:57:17 +08:00
Update Docker images: new directory structure
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
FROM photoprism/development:20190626
|
FROM photoprism/development:20190629
|
||||||
|
|
||||||
# Set up project directory
|
# Set up project directory
|
||||||
WORKDIR "/go/src/github.com/photoprism/photoprism"
|
WORKDIR "/go/src/github.com/photoprism/photoprism"
|
||||||
|
@@ -4,7 +4,7 @@ FROM photoprism/photoprism:latest as build
|
|||||||
ENV TF_CPP_MIN_LOG_LEVEL 2
|
ENV TF_CPP_MIN_LOG_LEVEL 2
|
||||||
|
|
||||||
RUN mkdir -p /srv/photoprism/photos/import && \
|
RUN mkdir -p /srv/photoprism/photos/import && \
|
||||||
wget -qO- https://dl.photoprism.org/fixtures/demo.tar.gz | tar xvz -C /srv/photoprism/photos/import
|
wget -qO- https://dl.photoprism.org/fixtures/demo.tar.gz | tar xvz -C Pictures/Import
|
||||||
|
|
||||||
# Import example photos
|
# Import example photos
|
||||||
RUN photoprism import
|
RUN photoprism import
|
||||||
|
@@ -43,7 +43,6 @@ RUN apt-get update && apt-get upgrade && \
|
|||||||
wget \
|
wget \
|
||||||
git \
|
git \
|
||||||
mysql-client \
|
mysql-client \
|
||||||
libgtk-3-bin \
|
|
||||||
tzdata \
|
tzdata \
|
||||||
gconf-service \
|
gconf-service \
|
||||||
chromium-browser \
|
chromium-browser \
|
||||||
@@ -58,15 +57,14 @@ RUN add-apt-repository ppa:pmjdebruijn/darktable-release && \
|
|||||||
apt-get upgrade && \
|
apt-get upgrade && \
|
||||||
apt-get dist-upgrade
|
apt-get dist-upgrade
|
||||||
|
|
||||||
# Install TensorFlow C library
|
# Install & configure TensorFlow for C
|
||||||
|
ENV LD_LIBRARY_PATH /root/.local/lib:/usr/local/lib:/usr/lib:/lib
|
||||||
|
ENV TF_CPP_MIN_LOG_LEVEL 0
|
||||||
RUN curl -L \
|
RUN curl -L \
|
||||||
"https://dl.photoprism.org/tensorflow/linux/libtensorflow-linux-avx-1.14.0.tar.gz" | \
|
"https://dl.photoprism.org/tensorflow/linux/libtensorflow-linux-avx-1.14.0.tar.gz" | \
|
||||||
tar -C "/usr" -xz
|
tar -C "/usr" -xz
|
||||||
RUN ldconfig
|
RUN ldconfig
|
||||||
|
|
||||||
# Show TensorFlow debug log
|
|
||||||
ENV TF_CPP_MIN_LOG_LEVEL 0
|
|
||||||
|
|
||||||
# Install NodeJS
|
# Install NodeJS
|
||||||
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash -
|
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash -
|
||||||
RUN apt-get update && \
|
RUN apt-get update && \
|
||||||
@@ -94,7 +92,7 @@ RUN set -eux; \
|
|||||||
# Configure Go environment
|
# Configure Go environment
|
||||||
ENV GOPATH /go
|
ENV GOPATH /go
|
||||||
ENV GOBIN $GOPATH/bin
|
ENV GOBIN $GOPATH/bin
|
||||||
ENV PATH $GOBIN:/usr/local/go/bin:$PATH
|
ENV PATH $GOBIN:/usr/local/go/bin:/root/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||||
ENV GO111MODULE on
|
ENV GO111MODULE on
|
||||||
RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH"
|
RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH"
|
||||||
|
|
||||||
@@ -108,16 +106,11 @@ RUN env GO111MODULE=off /usr/local/go/bin/go get -u golang.org/x/tools/cmd/goimp
|
|||||||
RUN env GO111MODULE=off /usr/local/go/bin/go get -u github.com/kyoh86/richgo
|
RUN env GO111MODULE=off /usr/local/go/bin/go get -u github.com/kyoh86/richgo
|
||||||
RUN echo "alias go=richgo" > /root/.bash_aliases
|
RUN echo "alias go=richgo" > /root/.bash_aliases
|
||||||
|
|
||||||
# Configure broadwayd (HTML5 display server)
|
|
||||||
# Command: broadwayd -p 8080 -a 0.0.0.0 :5
|
|
||||||
ENV GDK_BACKEND broadway
|
|
||||||
ENV BROADWAY_DISPLAY :5
|
|
||||||
|
|
||||||
# Set up project directory
|
# Set up project directory
|
||||||
WORKDIR "/go/src/github.com/photoprism/photoprism"
|
WORKDIR "/go/src/github.com/photoprism/photoprism"
|
||||||
|
|
||||||
# Expose HTTP port plus 4000 for TiDB, 8080 for broadwayd and 9515 for chromedriver
|
# Expose HTTP port 2342 plus 4000 for TiDB and 9515 for chromedriver
|
||||||
EXPOSE 80 2342 4000 8080 9515
|
EXPOSE 2342 4000 9515
|
||||||
|
|
||||||
# Keep container running (services can be started manually using a terminal)
|
# Keep container running (services can be started manually using a terminal)
|
||||||
CMD tail -f /dev/null
|
CMD tail -f /dev/null
|
||||||
|
@@ -1,21 +1,17 @@
|
|||||||
FROM photoprism/development:20190626 as build
|
FROM photoprism/development:20190629 as build
|
||||||
|
|
||||||
# Set up project directory
|
# Set up project directory
|
||||||
WORKDIR "/go/src/github.com/photoprism/photoprism"
|
WORKDIR "/go/src/github.com/photoprism/photoprism"
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
# Build PhotoPrism
|
# Build PhotoPrism
|
||||||
RUN make all install
|
RUN make dep build-js install
|
||||||
|
|
||||||
# Base base image as photoprism/development
|
# Base base image as photoprism/development
|
||||||
FROM ubuntu:18.04
|
FROM ubuntu:18.04
|
||||||
|
|
||||||
# Set environment variables
|
# Set environment variables
|
||||||
ENV DEBIAN_FRONTEND noninteractive
|
ENV DEBIAN_FRONTEND noninteractive
|
||||||
ENV TF_CPP_MIN_LOG_LEVEL 2
|
|
||||||
ENV PHOTOPRISM_CONFIG_FILE /srv/photoprism/config/photoprism.yml
|
|
||||||
|
|
||||||
WORKDIR /srv/photoprism
|
|
||||||
|
|
||||||
# Install additional distribution packages
|
# Install additional distribution packages
|
||||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
@@ -30,15 +26,11 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
|||||||
apt-get clean && \
|
apt-get clean && \
|
||||||
rm -rf /var/lib/apt/lists/*
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
# Copy built binaries and assets to this image
|
# Copy dependencies
|
||||||
COPY --from=build /etc/apt/sources.list.d/pmjdebruijn-ubuntu-darktable-release-bionic.list /etc/apt/sources.list.d/pmjdebruijn-ubuntu-darktable-release-bionic.list
|
COPY --from=build /etc/apt/sources.list.d/pmjdebruijn-ubuntu-darktable-release-bionic.list /etc/apt/sources.list.d/pmjdebruijn-ubuntu-darktable-release-bionic.list
|
||||||
COPY --from=build /etc/apt/trusted.gpg.d/pmjdebruijn_ubuntu_darktable-release.gpg /etc/apt/trusted.gpg.d/pmjdebruijn_ubuntu_darktable-release.gpg
|
COPY --from=build /etc/apt/trusted.gpg.d/pmjdebruijn_ubuntu_darktable-release.gpg /etc/apt/trusted.gpg.d/pmjdebruijn_ubuntu_darktable-release.gpg
|
||||||
COPY --from=build /usr/local/bin/photoprism /usr/local/bin/photoprism
|
|
||||||
COPY --from=build /usr/lib/libtensorflow.so /usr/lib/libtensorflow.so
|
COPY --from=build /usr/lib/libtensorflow.so /usr/lib/libtensorflow.so
|
||||||
COPY --from=build /usr/lib/libtensorflow_framework.so /usr/lib/libtensorflow_framework.so
|
COPY --from=build /usr/lib/libtensorflow_framework.so /usr/lib/libtensorflow_framework.so
|
||||||
COPY --from=build /srv/photoprism /srv/photoprism
|
|
||||||
|
|
||||||
# Configure dynamic linker run-time bindings
|
|
||||||
RUN ldconfig
|
RUN ldconfig
|
||||||
|
|
||||||
# Install darktable (RAW to JPEG converter)
|
# Install darktable (RAW to JPEG converter)
|
||||||
@@ -47,12 +39,36 @@ RUN apt-get update && \
|
|||||||
apt-get clean && \
|
apt-get clean && \
|
||||||
rm -rf /var/lib/apt/lists/*
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Create and configure photoprism user
|
||||||
|
RUN useradd -ms /bin/bash photoprism
|
||||||
|
USER photoprism
|
||||||
|
|
||||||
|
WORKDIR /home/photoprism
|
||||||
|
ENV PATH /home/photoprism/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||||
|
ENV TF_CPP_MIN_LOG_LEVEL 2
|
||||||
|
ENV PHOTOPRISM_CONFIG_FILE /home/photoprism/.config/photoprism/photoprism.yml
|
||||||
|
|
||||||
|
# Copy assets to /home/photoprism
|
||||||
|
COPY --chown=photoprism --from=build /root/.local/bin/photoprism /home/photoprism/.local/bin/photoprism
|
||||||
|
COPY --chown=photoprism --from=build /root/.local/share/photoprism /home/photoprism/.local/share/photoprism
|
||||||
|
COPY --chown=photoprism --from=build /root/.config/photoprism /home/photoprism/.config/photoprism
|
||||||
|
|
||||||
|
# Create directories
|
||||||
|
RUN mkdir -p /home/photoprism/.cache/photoprism \
|
||||||
|
/home/photoprism/Pictures/Originals \
|
||||||
|
/home/photoprism/Pictures/Import \
|
||||||
|
/home/photoprism/Pictures/Export
|
||||||
|
|
||||||
|
# Fix permissions
|
||||||
|
USER root
|
||||||
|
RUN chown -R photoprism:photoprism /home/photoprism
|
||||||
|
USER photoprism
|
||||||
|
|
||||||
# Show photoprism version
|
# Show photoprism version
|
||||||
RUN photoprism -v
|
RUN photoprism -v
|
||||||
|
|
||||||
# Expose HTTP & TiDB port
|
# Expose http and database ports
|
||||||
EXPOSE 80
|
EXPOSE 2342 4000
|
||||||
EXPOSE 4000
|
|
||||||
|
|
||||||
# Start PhotoPrism server
|
# Run server
|
||||||
CMD photoprism start
|
CMD photoprism start
|
||||||
|
@@ -1,22 +1,22 @@
|
|||||||
version: '3.3'
|
version: '3.3'
|
||||||
|
|
||||||
# Example docker-compose config file for production use
|
# Example docker-compose config file for production use
|
||||||
|
# Container image on Docker Hub: https://hub.docker.com/r/photoprism/photoprism/
|
||||||
|
# To keep photoprism running, add "restart: always"
|
||||||
|
#
|
||||||
# Usage: docker-compose up
|
# Usage: docker-compose up
|
||||||
|
|
||||||
services:
|
services:
|
||||||
photoprism: # change if needed
|
photoprism:
|
||||||
image: photoprism/photoprism:latest # use pre-built image from docker hub: https://hub.docker.com/r/photoprism/photoprism/
|
image: photoprism/photoprism:latest
|
||||||
restart: always
|
|
||||||
ports:
|
ports:
|
||||||
- 2342:80 # left side is your local port (change if port 2342 is already used or you want to use port 80)
|
- 2342:2342 # [local port]:[container port]
|
||||||
volumes:
|
volumes:
|
||||||
- "~/Photos:/srv/photoprism/photos" # change ~/Photos to whatever directory you want to use on your local computer
|
- "~/Pictures/Originals:/home/photoprism/Pictures/Originals" # [local path]:[container path]
|
||||||
- "photoprism-cache:/srv/photoprism/cache" # keep this (thumbnail cache)
|
- "~/Pictures/Import:/home/photoprism/Pictures/Import" # [local path]:[container path] (optional)
|
||||||
- "photoprism-database:/srv/photoprism/database" # keep this (database files)
|
- "~/Pictures/Export:/home/photoprism/Pictures/Export" # [local path]:[container path] (optional)
|
||||||
environment:
|
- "photoprism-cache:/home/photoprism/.cache/photoprism" # keep thumbnail cache
|
||||||
PHOTOPRISM_IMPORT_PATH: /srv/photoprism/photos/Import # ~/Photos/Import (files to be imported to originals)
|
- "photoprism-database:/home/photoprism/.local/share/photoprism/resources/database" # keep database files
|
||||||
PHOTOPRISM_EXPORT_PATH: /srv/photoprism/photos/Export # ~/Photos/Export (files exported from originals)
|
|
||||||
PHOTOPRISM_ORIGINALS_PATH: /srv/photoprism/photos/Originals # ~/Photos/Originals (original jpeg, raw and meta files)
|
|
||||||
|
|
||||||
volumes: # keep this
|
volumes: # keep this
|
||||||
photoprism-cache:
|
photoprism-cache:
|
||||||
|
@@ -102,7 +102,7 @@ func startAction(ctx *cli.Context) error {
|
|||||||
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
|
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
|
||||||
|
|
||||||
<-quit
|
<-quit
|
||||||
log.Info("Shutting down...")
|
log.Info("shutting down...")
|
||||||
conf.Shutdown()
|
conf.Shutdown()
|
||||||
cancel()
|
cancel()
|
||||||
err := dctx.Release()
|
err := dctx.Release()
|
||||||
|
@@ -31,6 +31,7 @@ var GlobalFlags = []cli.Flag{
|
|||||||
cli.StringFlag{
|
cli.StringFlag{
|
||||||
Name: "config-path",
|
Name: "config-path",
|
||||||
Usage: "config `PATH`",
|
Usage: "config `PATH`",
|
||||||
|
Value: "~/.config/photoprism",
|
||||||
EnvVar: "PHOTOPRISM_CONFIG_PATH",
|
EnvVar: "PHOTOPRISM_CONFIG_PATH",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
cli.StringFlag{
|
||||||
@@ -41,31 +42,31 @@ var GlobalFlags = []cli.Flag{
|
|||||||
cli.StringFlag{
|
cli.StringFlag{
|
||||||
Name: "originals-path",
|
Name: "originals-path",
|
||||||
Usage: "originals `PATH`",
|
Usage: "originals `PATH`",
|
||||||
Value: "/srv/photoprism/photos/originals",
|
Value: "~/Pictures/Originals",
|
||||||
EnvVar: "PHOTOPRISM_ORIGINALS_PATH",
|
EnvVar: "PHOTOPRISM_ORIGINALS_PATH",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
cli.StringFlag{
|
||||||
Name: "import-path",
|
Name: "import-path",
|
||||||
Usage: "import `PATH`",
|
Usage: "import `PATH`",
|
||||||
Value: "/srv/photoprism/photos/import",
|
Value: "~/Pictures/Import",
|
||||||
EnvVar: "PHOTOPRISM_IMPORT_PATH",
|
EnvVar: "PHOTOPRISM_IMPORT_PATH",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
cli.StringFlag{
|
||||||
Name: "export-path",
|
Name: "export-path",
|
||||||
Usage: "export `PATH`",
|
Usage: "export `PATH`",
|
||||||
Value: "/srv/photoprism/photos/export",
|
Value: "~/Pictures/Export",
|
||||||
EnvVar: "PHOTOPRISM_EXPORT_PATH",
|
EnvVar: "PHOTOPRISM_EXPORT_PATH",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
cli.StringFlag{
|
||||||
Name: "cache-path",
|
Name: "cache-path",
|
||||||
Usage: "cache `PATH`",
|
Usage: "cache `PATH`",
|
||||||
Value: "/srv/photoprism/cache",
|
Value: "~/.cache/photoprism",
|
||||||
EnvVar: "PHOTOPRISM_CACHE_PATH",
|
EnvVar: "PHOTOPRISM_CACHE_PATH",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
cli.StringFlag{
|
||||||
Name: "assets-path",
|
Name: "assets-path",
|
||||||
Usage: "assets `PATH`",
|
Usage: "assets `PATH`",
|
||||||
Value: "/srv/photoprism",
|
Value: "~/.local/share/photoprism",
|
||||||
EnvVar: "PHOTOPRISM_ASSETS_PATH",
|
EnvVar: "PHOTOPRISM_ASSETS_PATH",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
cli.StringFlag{
|
||||||
@@ -83,7 +84,7 @@ var GlobalFlags = []cli.Flag{
|
|||||||
cli.IntFlag{
|
cli.IntFlag{
|
||||||
Name: "http-port, p",
|
Name: "http-port, p",
|
||||||
Usage: "HTTP server port",
|
Usage: "HTTP server port",
|
||||||
Value: 80,
|
Value: 2342,
|
||||||
EnvVar: "PHOTOPRISM_HTTP_PORT",
|
EnvVar: "PHOTOPRISM_HTTP_PORT",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
cli.StringFlag{
|
||||||
@@ -156,13 +157,13 @@ var GlobalFlags = []cli.Flag{
|
|||||||
Name: "daemon-pid-path",
|
Name: "daemon-pid-path",
|
||||||
Usage: "File path to store daemon PID",
|
Usage: "File path to store daemon PID",
|
||||||
EnvVar: "PHOTOPRISM_DAEMON_PID_PATH",
|
EnvVar: "PHOTOPRISM_DAEMON_PID_PATH",
|
||||||
Value: "/srv/photoprism/photoprism.pid",
|
Value: "~/.local/share/photoprism/photoprism.pid",
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
cli.StringFlag{
|
||||||
Name: "daemon-log-path",
|
Name: "daemon-log-path",
|
||||||
Usage: "File path for daemon logs.",
|
Usage: "File path for daemon logs.",
|
||||||
EnvVar: "PHOTOPRISM_DAEMON_LOG_PATH",
|
EnvVar: "PHOTOPRISM_DAEMON_LOG_PATH",
|
||||||
Value: "/srv/photoprism/photoprism.log",
|
Value: "~/.local/share/photoprism/photoprism.log",
|
||||||
},
|
},
|
||||||
cli.BoolFlag{
|
cli.BoolFlag{
|
||||||
Name: "daemonize, d",
|
Name: "daemonize, d",
|
||||||
|
@@ -8,42 +8,44 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func InitDatabase(port uint, password string) error {
|
func InitDatabase(port uint, password string) error {
|
||||||
log.Info("init database: trying login without password")
|
log.Info("initializing database...")
|
||||||
|
|
||||||
db, err := sql.Open("mysql", fmt.Sprintf("root:@tcp(localhost:%d)/", port))
|
db, err := sql.Open("mysql", fmt.Sprintf("root:@tcp(localhost:%d)/", port))
|
||||||
|
|
||||||
defer db.Close()
|
defer db.Close()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Debugf("init database: %s", err)
|
log.Debug(err.Error())
|
||||||
log.Debug("init database: login as root with password")
|
log.Debug("database login as root with password")
|
||||||
db, err = sql.Open("mysql", fmt.Sprintf("root:%s@tcp(localhost:%d)/", password, port))
|
db, err = sql.Open("mysql", fmt.Sprintf("root:%s@tcp(localhost:%d)/", password, port))
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(err)
|
log.Error(err.Error())
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Debug("init database: login was successful")
|
log.Debug("set database password")
|
||||||
|
|
||||||
_, err = db.Exec(fmt.Sprintf("SET PASSWORD FOR 'root'@'%%' = '%s'", password))
|
_, err = db.Exec(fmt.Sprintf("SET PASSWORD FOR 'root'@'%%' = '%s'", password))
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(err)
|
log.Error(err.Error())
|
||||||
} else {
|
} else {
|
||||||
log.Debug("init database: FLUSH PRIVILEGES")
|
log.Debug("flush database privileges")
|
||||||
|
|
||||||
_, err = db.Exec("FLUSH PRIVILEGES")
|
_, err = db.Exec("FLUSH PRIVILEGES")
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Debug("init database: CREATE DATABASE IF NOT EXISTS photoprism")
|
log.Debug("create database if not exists")
|
||||||
|
|
||||||
_, err = db.Exec("CREATE DATABASE IF NOT EXISTS photoprism")
|
_, err = db.Exec("CREATE DATABASE IF NOT EXISTS photoprism")
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(err)
|
log.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.Info("database created")
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@@ -1,13 +1,11 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
if [[ -z $DOCKER_PASSWORD ]] || [[ -z $DOCKER_USERNAME ]]; then
|
if [[ -z $DOCKER_PASSWORD ]] || [[ -z $DOCKER_USERNAME ]]; then
|
||||||
echo "DOCKER_PASSWORD and DOCKER_USERNAME not set in your environment";
|
docker login
|
||||||
exit 1
|
else
|
||||||
|
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
|
|
||||||
|
|
||||||
|
|
||||||
if [[ -z $1 ]] || [[ -z $2 ]]; then
|
if [[ -z $1 ]] || [[ -z $2 ]]; then
|
||||||
echo "Please provide a container image name and version" 1>&2
|
echo "Please provide a container image name and version" 1>&2
|
||||||
exit 1
|
exit 1
|
||||||
|
Reference in New Issue
Block a user