client: docker: complete build overhaul, optimize

This commit brings a complete overhaul of the build system:

- Creates a separation of concerns for 'local' and 'remote' building
  * 'local' is built locally via the docker-finance `build` command
  * 'remote' is built *outside* of the docker-finance `build` command
    (pushed to a remote registry and then pulled by the 'local' build)
  * Related refactoring
    - Dockerfiles
    - `lib_gen`

- Adds remote image 'hledger-suite'
  * Provides the latest versions of all `hledger` related binaries
  * No longer relies on package maintainers / out-dated packages

- Adds remote image 'docker-finance'
  * Provides base image for 'finance' and 'dev-tools' images
    - tags 'archlinux' | 'ubuntu' | 'dev-tools'

- Removes previous `hledger` related build modules
  * Removes building any `hledger` related binaries locally

- Removes 'experimental' build
  * End-user can use local custom Dockerfile and/or custom tag instead

- Updates the 'default' | 'slim' | 'tiny' | 'micro' build types
  * Refactors build type requirements into separate build modules
    - Adds 'fetch' module
    - Adds 'track' module
    - Adds 'user' module
      * creates container user *after* base and all other modules
      * allows for quick re-building across multiple local users
    - Updates 'root' module
  * `lib_docker`
    - Updates usage help
    - Adds build modules per build type

- Huge optimizations
  * Vastly improves build times
    - ~60% faster w/ a fresh build
    - ~60%-90% faster rebuild (depending on image type)
  * Vastly improves image sizes
    - e.g., 'default' Arch Linux image size is ~50% smaller
This commit is contained in:
2024-09-16 21:46:11 -07:00
parent 9feb05be2d
commit dc4990ab90
34 changed files with 554 additions and 582 deletions

7
.gitignore vendored
View File

@@ -1,4 +1,7 @@
**/Dockerfile
**/docker-compose.yml
client/Dockerfiles/local/dev-tools/Dockerfile
client/Dockerfiles/local/dev-tools/docker-compose.yml
client/Dockerfiles/local/finance/Dockerfile
client/Dockerfiles/local/finance/docker-compose.yml
client/Dockerfiles/remote/build-push.bash
client/Doxygen/html
gitea-merge.bash

View File

@@ -1,98 +0,0 @@
# docker-finance | modern accounting for the power-user
#
# Copyright (C) 2021-2024 Aaron Fiore (Founder, Evergreen Crypto LLC)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
# https://hub.docker.com/_/archlinux
FROM archlinux:base-devel
#
# System preparation
#
# Add system-level user for building (won't pollute user-level UID space)
RUN useradd -m -s /bin/bash -r builder
RUN gpasswd -a builder wheel
# Prepare for non-package dependencies
RUN chown root:wheel /usr/local/* && chmod g+rwx /usr/local/*
#
# Package dependencies
#
RUN pacman -Syu \
csvkit \
git \
hledger \
hledger-iadd \
hledger-ui \
hledger-web \
timew \
vim \
visidata \
xsv \
yq \
--noconfirm --disable-download-timeout
#
# `fetch` APIs
#
USER root
RUN pacman -Syu \
bc \
composer \
proxychains-ng \
--noconfirm --disable-download-timeout
RUN sed -i \
-e 's:^;extension=bcmath:extension=bcmath:' \
-e 's:^;extension=gmp:extension=gmp:' \
-e 's:^;extension=iconv:extension=iconv:' \
/etc/php/php.ini
USER builder
WORKDIR /usr/local/lib/php
# NOTE: Coinbase Pro has been "sunsetted"
#RUN composer require mocking-magician/coinbase-pro-sdk
RUN composer require ozdemirburak/json-csv
RUN composer require ccxt/ccxt
#
# Shell environment
#
# Add `finance` user
USER root
RUN useradd -m -s /bin/bash @DOCKER_FINANCE_USER@ -u @DOCKER_FINANCE_UID@
USER @DOCKER_FINANCE_USER@
RUN echo "source \"\${DOCKER_FINANCE_CONTAINER_CONF}/shell/superscript.bash\"" | tee -a ~/.bashrc
RUN echo "source \"\${DOCKER_FINANCE_CONTAINER_REPO}/src/finance/completion.bash\"" | tee -a ~/.bashrc
#
# Entrypoint
#
USER root
COPY ./entrypoint.bash /entrypoint.bash
RUN chmod a+rx /entrypoint.bash
USER @DOCKER_FINANCE_USER@
ENTRYPOINT ["/entrypoint.bash"]
# vim: sw=2 sts=2 si ai et

View File

@@ -1,103 +0,0 @@
# docker-finance | modern accounting for the power-user
#
# Copyright (C) 2021-2024 Aaron Fiore (Founder, Evergreen Crypto LLC)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
FROM ubuntu:rolling
#
# System preparation
#
RUN groupadd -r wheel
# Remove default `ubuntu` user which may conflict with host user's UID/GID (1000:1000)
RUN userdel -r ubuntu
# Add system-level user for building (won't pollute user-level UID space)
RUN useradd -m -s /bin/bash -r builder
RUN gpasswd -a builder wheel
# Prepare for non-package dependencies
RUN chown root:wheel /usr/local/* && chmod g+rwx /usr/local/*
#
# Package dependencies
#
RUN apt-get update -y
RUN apt-get install -y \
csvkit \
gawk \
git \
hledger \
hledger-ui \
hledger-web \
timewarrior \
vim \
visidata \
yq \
zlib1g-dev
RUN apt-get install -y cargo
RUN cargo install xsv --root /usr
#
# `fetch` APIs
#
USER root
RUN apt-get install -y \
bc \
composer \
php \
php-bcmath \
php-curl \
php-gmp \
proxychains4
USER builder
WORKDIR /usr/local/lib/php
# NOTE: Coinbase Pro has been "sunsetted"
#RUN composer require mocking-magician/coinbase-pro-sdk
RUN composer require ozdemirburak/json-csv
RUN composer require ccxt/ccxt
#
# Shell environment
#
# Add `finance` user
RUN useradd -m -s /bin/bash @DOCKER_FINANCE_USER@ -u @DOCKER_FINANCE_UID@
USER @DOCKER_FINANCE_USER@
RUN echo "source \"\${DOCKER_FINANCE_CONTAINER_CONF}/shell/superscript.bash\"" | tee -a ~/.bash_aliases
RUN echo "source \"\${DOCKER_FINANCE_CONTAINER_REPO}/src/finance/completion.bash\"" | tee -a ~/.bash_aliases
#
# Entrypoint
#
USER root
COPY ./entrypoint.bash /entrypoint.bash
RUN chmod a+rx /entrypoint.bash
USER @DOCKER_FINANCE_USER@
WORKDIR /home/@DOCKER_FINANCE_USER@
ENTRYPOINT ["/entrypoint.bash"]
# vim: sw=2 sts=2 si ai et

View File

@@ -1,30 +0,0 @@
# docker-finance | modern accounting for the power-user
#
# Copyright (C) 2021-2024 Aaron Fiore (Founder, Evergreen Crypto LLC)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
# hledger-flow (binary)
#
USER builder
WORKDIR /usr/local/src
RUN curl --location -O "https://github.com/apauley/hledger-flow/releases/download/v0.15.0/hledger-flow_Linux_x86_64_v0.15.0_2b025fe.tar.gz"
RUN tar xvzf "hledger-flow_Linux_x86_64_v0.15.0_2b025fe.tar.gz"
WORKDIR /usr/local/src/hledger-flow_Linux_x86_64_v0.15.0_2b025fe
RUN sha256sum -c "sha256-hledger-flow_Linux_x86_64_v0.15.0_2b025fe.txt"
RUN mv hledger-flow /usr/local/bin/
# vim: sw=2 sts=2 si ai et

View File

@@ -1,33 +0,0 @@
# docker-finance | modern accounting for the power-user
#
# Copyright (C) 2021-2024 Aaron Fiore (Founder, Evergreen Crypto LLC)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
# hledger-flow (binary)
#
USER root
RUN apt-get install -y curl
USER builder
WORKDIR /usr/local/src
RUN curl --location -O "https://github.com/apauley/hledger-flow/releases/download/v0.15.0/hledger-flow_Linux_x86_64_v0.15.0_2b025fe.tar.gz"
RUN tar xvzf "hledger-flow_Linux_x86_64_v0.15.0_2b025fe.tar.gz"
WORKDIR /usr/local/src/hledger-flow_Linux_x86_64_v0.15.0_2b025fe
RUN sha256sum -c "sha256-hledger-flow_Linux_x86_64_v0.15.0_2b025fe.txt"
RUN mv hledger-flow /usr/local/bin/
# vim: sw=2 sts=2 si ai et

View File

@@ -1,41 +0,0 @@
# docker-finance | modern accounting for the power-user
#
# Copyright (C) 2024 Aaron Fiore (Evergreen Crypto LLC)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
# hledger (source)
#
USER root
# Remove pre-existing
RUN apt-get autoremove --purge -y \
hledger \
hledger-ui \
hledger-web
RUN apt-get install -y \
haskell-stack
USER builder
WORKDIR /usr/local/src
RUN git clone https://github.com/simonmichael/hledger -b master
WORKDIR /usr/local/src/hledger
RUN stack update
RUN stack install --resolver="lts-22.28" --install-ghc --local-bin-path=/usr/local/bin
# vim: sw=2 sts=2 si ai et

View File

@@ -1,75 +0,0 @@
# docker-finance | modern accounting for the power-user
#
# Copyright (C) 2021-2024 Aaron Fiore (Founder, Evergreen Crypto LLC)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
# ROOT.cern (and docker-finance requirements)
#
USER root
# ROOT.cern dependencies (regardless of building or not)
RUN apt-get install -y \
binutils \
cmake \
dpkg-dev \
g++ \
gcc \
libssl-dev \
libtbb-dev \
libx11-dev \
libxext-dev \
libxft-dev \
libxpm-dev \
python3
# ROOT.cern pre-compiled installation
RUN apt-get install -y curl
USER builder
WORKDIR /usr/local/src
RUN curl --location -O "https://root.cern/download/root_v6.32.02.Linux-ubuntu24.04-x86_64-gcc13.2.tar.gz"
RUN tar xvzf "root_v6.32.02.Linux-ubuntu24.04-x86_64-gcc13.2.tar.gz"
# ROOT.cern environment
#
# bash_aliases notes:
#
# - *MUST* source thisroot.sh (from any directory)
#
# - For `docker-finance version` command:
#
# - To avoid thisroot.sh error, pushd/popd is required (per thisroot.sh)
#
# - Although $ROOTSYS will be available during normal operation, it won't
# be avaialble to `docker-finance version`- so add binary to PATH here.
USER @DOCKER_FINANCE_USER@
RUN echo "pushd /usr/local/src/root/bin 1>/dev/null && source \"/usr/local/src/root/bin/thisroot.sh\" && popd 1>/dev/null" | tee -a ~/.bash_aliases
RUN echo "export PATH=\"\$PATH::/usr/local/src/root/bin\"" | tee -a ~/.bash_aliases
# docker-finance
USER root
RUN apt-get install -y \
googletest \
libbenchmark-dev \
libbotan-2-dev \
libcrypto++-dev \
libsodium-dev
# docker-finance (experimental / testing)
RUN apt-get install -y \
libunuran-dev
# vim: sw=2 sts=2 si ai et

View File

@@ -0,0 +1,21 @@
# docker-finance | modern accounting for the power-user
#
# Copyright (C) 2021-2024 Aaron Fiore (Founder, Evergreen Crypto LLC)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
# https://hub.docker.com/evergreencrypto/docker-finance
FROM evergreencrypto/docker-finance:dev-tools
# vim: sw=2 sts=2 si ai et

View File

@@ -16,28 +16,15 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
# ROOT.cern (and docker-finance requirements)
# 'user' module
#
USER root
# ROOT.cern
RUN pacman -Syu \
root \
--noconfirm --disable-download-timeout
# Remove default 'ubuntu' user which may conflict with host user's UID/GID (1000:1000)
RUN userdel -r ubuntu
# docker-finance
RUN pacman -Syu \
benchmark \
botan2 \
crypto++ \
gtest \
libsodium \
--noconfirm --disable-download-timeout
# docker-finance (experimental / testing)
RUN pacman -Syu \
unuran \
--noconfirm --disable-download-timeout
# Add 'dev-tools' user
RUN useradd -m -s /bin/bash @DOCKER_FINANCE_USER@ -u @DOCKER_FINANCE_UID@
# vim: sw=2 sts=2 si ai et

View File

@@ -0,0 +1,21 @@
# docker-finance | modern accounting for the power-user
#
# Copyright (C) 2021-2024 Aaron Fiore (Founder, Evergreen Crypto LLC)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
# https://hub.docker.com/evergreencrypto/docker-finance
FROM evergreencrypto/docker-finance:archlinux
# vim: sw=2 sts=2 si ai et

View File

@@ -0,0 +1,21 @@
# docker-finance | modern accounting for the power-user
#
# Copyright (C) 2021-2024 Aaron Fiore (Founder, Evergreen Crypto LLC)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
# https://hub.docker.com/evergreencrypto/docker-finance
FROM evergreencrypto/docker-finance:ubuntu
# vim: sw=2 sts=2 si ai et

View File

@@ -16,24 +16,31 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
# hledger-flow (source)
# 'fetch' module
#
USER root
RUN pacman -Syu \
stack \
composer \
proxychains-ng \
--noconfirm --disable-download-timeout
# TODO: upstream-integrate with hledger? packaged somewhere? would like to not have to clone and build here...
RUN sed -i \
-e 's:^;extension=bcmath:extension=bcmath:' \
-e 's:^;extension=gmp:extension=gmp:' \
-e 's:^;extension=iconv:extension=iconv:' \
/etc/php/php.ini
# Add builder user for `composer`
RUN useradd -m -s /bin/bash -r builder
USER builder
WORKDIR /usr/local/lib/php
WORKDIR /usr/local/src
RUN git clone --depth=1 https://github.com/apauley/hledger-flow -b v0.15.0
WORKDIR /usr/local/src/hledger-flow
RUN stack setup
RUN stack build
RUN stack install --local-bin-path=/usr/local/bin
RUN composer require -n ozdemirburak/json-csv
RUN composer require -n ccxt/ccxt
# "Sunsetted" Coinbase Pro
#RUN composer require mocking-magician/coinbase-pro-sdk
# vim: sw=2 sts=2 si ai et

View File

@@ -16,7 +16,7 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
# ROOT.cern (and docker-finance requirements)
# 'root' module
#
USER root

View File

@@ -16,24 +16,15 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
# hledger-flow (source)
# 'track' module
#
USER root
RUN pacman -Syu \
stack \
git \
timew \
visidata \
--noconfirm --disable-download-timeout
USER builder
WORKDIR /usr/local/src
RUN git clone https://github.com/apauley/hledger-flow -b master
WORKDIR /usr/local/src/hledger-flow
RUN stack setup
RUN stack build
RUN stack test --interleaved-output --pedantic
RUN stack install --local-bin-path=/usr/local/bin
# vim: sw=2 sts=2 si ai et

View File

@@ -0,0 +1,30 @@
# docker-finance | modern accounting for the power-user
#
# Copyright (C) 2021-2024 Aaron Fiore (Founder, Evergreen Crypto LLC)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
# 'user' module
#
# Add 'finance' user
USER root
RUN useradd -m -s /bin/bash @DOCKER_FINANCE_USER@ -u @DOCKER_FINANCE_UID@
USER @DOCKER_FINANCE_USER@
RUN echo "source \"\${DOCKER_FINANCE_CONTAINER_CONF}/shell/superscript.bash\"" >>~/.bashrc
RUN echo "source \"\${DOCKER_FINANCE_CONTAINER_REPO}/src/finance/completion.bash\"" >>~/.bashrc
# vim: sw=2 sts=2 si ai et

View File

@@ -16,24 +16,29 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
# hledger-flow (source)
# 'fetch' module
#
USER root
RUN apt-get install -y \
g++ \
haskell-stack
composer \
curl \
php \
php-bcmath \
php-curl \
php-gmp \
proxychains4
# Add builder user for `composer`
RUN useradd -m -s /bin/bash -r builder
# TODO: upstream-integrate with hledger? packaged somewhere? would like to not have to clone and build here...
USER builder
WORKDIR /usr/local/lib/php
WORKDIR /usr/local/src
RUN git clone --depth=1 https://github.com/apauley/hledger-flow -b v0.15.0
WORKDIR /usr/local/src/hledger-flow
RUN stack setup
RUN stack build
RUN stack install --local-bin-path=/usr/local/bin
RUN composer require ozdemirburak/json-csv
RUN composer require ccxt/ccxt
# "Sunsetted" Coinbase Pro
#RUN composer require mocking-magician/coinbase-pro-sdk
# vim: sw=2 sts=2 si ai et

View File

@@ -16,7 +16,7 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
# ROOT.cern (and docker-finance requirements)
# 'root' module
#
USER root
@@ -38,7 +38,6 @@ RUN apt-get install -y \
# ROOT.cern pre-compiled installation
RUN apt-get install -y curl
USER builder
WORKDIR /usr/local/src
RUN curl --location -O "https://root.cern/download/root_v6.32.02.Linux-ubuntu24.04-x86_64-gcc13.2.tar.gz"
RUN tar xvzf "root_v6.32.02.Linux-ubuntu24.04-x86_64-gcc13.2.tar.gz"
@@ -55,9 +54,8 @@ RUN tar xvzf "root_v6.32.02.Linux-ubuntu24.04-x86_64-gcc13.2.tar.gz"
#
# - Although $ROOTSYS will be available during normal operation, it won't
# be avaialble to `docker-finance version`- so add binary to PATH here.
USER @DOCKER_FINANCE_USER@
RUN echo "pushd /usr/local/src/root/bin 1>/dev/null && source \"/usr/local/src/root/bin/thisroot.sh\" && popd 1>/dev/null" | tee -a ~/.bash_aliases
RUN echo "export PATH=\"\$PATH::/usr/local/src/root/bin\"" | tee -a ~/.bash_aliases
RUN echo "pushd /usr/local/src/root/bin 1>/dev/null && source \"/usr/local/src/root/bin/thisroot.sh\" && popd 1>/dev/null" >>/etc/bash.bashrc
RUN echo "export PATH=\"\$PATH::/usr/local/src/root/bin\"" >>/etc/bash.bashrc
# docker-finance
USER root

View File

@@ -16,24 +16,14 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
# hledger-flow (source)
# 'track' module
#
USER root
RUN apt-get install -y \
g++ \
haskell-stack
USER builder
WORKDIR /usr/local/src
RUN git clone https://github.com/apauley/hledger-flow -b master
WORKDIR /usr/local/src/hledger-flow
RUN stack setup
RUN stack build
RUN stack test --interleaved-output --pedantic
RUN stack install --local-bin-path=/usr/local/bin
git \
timewarrior \
visidata
# vim: sw=2 sts=2 si ai et

View File

@@ -0,0 +1,33 @@
# docker-finance | modern accounting for the power-user
#
# Copyright (C) 2021-2024 Aaron Fiore (Founder, Evergreen Crypto LLC)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
# 'user' module
#
# Remove default 'ubuntu' user which may conflict with host user's UID/GID (1000:1000)
USER root
RUN userdel -r ubuntu
# Add 'finance' user
RUN useradd -m -s /bin/bash @DOCKER_FINANCE_USER@ -u @DOCKER_FINANCE_UID@
USER @DOCKER_FINANCE_USER@
RUN echo "source \"\${DOCKER_FINANCE_CONTAINER_CONF}/shell/superscript.bash\"" >>~/.bash_aliases
RUN echo "source \"\${DOCKER_FINANCE_CONTAINER_REPO}/src/finance/completion.bash\"" >>~/.bash_aliases
# vim: sw=2 sts=2 si ai et

View File

@@ -17,27 +17,13 @@
FROM ubuntu:rolling
#
# System
#
RUN groupadd -r wheel
# Remove default `ubuntu` user which may conflict with host user's UID/GID (1000:1000)
RUN userdel -r ubuntu
# Add `dev-tools` user
RUN useradd -m -s /bin/bash @DOCKER_FINANCE_USER@ -u @DOCKER_FINANCE_UID@
RUN gpasswd -a @DOCKER_FINANCE_USER@ wheel
# System-level user for building (won't pollute user-level UID space)
RUN useradd -m -s /bin/bash -r builder && gpasswd -a builder wheel
RUN gpasswd -a builder wheel
RUN apt-get update -y
# Add builder user (for `composer` and non-root building)
RUN useradd -m -s /bin/bash -r builder
#
# `dev-tools` Linters
# 'dev-tools' linters
#
# Bash
@@ -49,43 +35,39 @@ RUN apt-get install -y clang-format cppcheck cpplint
# PHP
RUN apt-get install -y composer
USER @DOCKER_FINANCE_USER@
WORKDIR /home/@DOCKER_FINANCE_USER@
USER builder
WORKDIR /usr/local/lib/php
RUN composer global require -n --dev friendsofphp/php-cs-fixer
RUN composer global require -n --dev phpstan/phpstan
RUN echo "export PATH=\"\${PATH}:\${HOME}/.composer/vendor/bin\"" | tee -a ~/.bash_aliases
#
# `finance` dependencies (fetch APIs)
#
RUN composer require -n --dev friendsofphp/php-cs-fixer
RUN composer require -n --dev phpstan/phpstan
USER root
RUN echo "export PATH=\"\$PATH:/usr/local/lib/php/vendor/bin\"" >>/etc/bash.bashrc
#
# 'finance' dependencies (`fetch` APIs)
#
RUN apt-get install -y php php-bcmath php-curl php-gmp
USER builder
WORKDIR /usr/local/lib/php
RUN composer require ozdemirburak/json-csv
RUN composer require ccxt/ccxt
RUN composer require -n ozdemirburak/json-csv
RUN composer require -n ccxt/ccxt
# "Sunsetted" Coinbase Pro
RUN composer require mocking-magician/coinbase-pro-sdk
RUN composer require -n mocking-magician/coinbase-pro-sdk
#
# 'dev-tools' misc.
#
# Allow real-time editing of libraries (useful for debugging)
USER root
RUN chown -R :wheel /usr/local/lib/php && chmod g+rwx /usr/local/lib/php
#
# `dev-tools` misc.
#
# Doxygen
RUN apt-get install -y doxygen graphviz
#
# Client-side `version` command
#
# docker-finance `version` command
RUN apt-get install -y yq
#
@@ -94,10 +76,6 @@ RUN apt-get install -y yq
COPY ./entrypoint.bash /entrypoint.bash
RUN chmod a+rx /entrypoint.bash
USER @DOCKER_FINANCE_USER@
WORKDIR /home/@DOCKER_FINANCE_USER@
ENTRYPOINT ["/entrypoint.bash"]
# vim: sw=2 sts=2 si ai et

View File

@@ -1,6 +1,6 @@
# docker-finance | modern accounting for the power-user
#
# Copyright (C) 2024 Aaron Fiore (Evergreen Crypto LLC)
# Copyright (C) 2024 Aaron Fiore (Founder, Evergreen Crypto LLC)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -15,25 +15,12 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
# hledger (source)
#
USER root
# Remove pre-existing
RUN pacman -Rsc \
hledger \
hledger-ui \
hledger-web \
--noconfirm
USER builder
WORKDIR /usr/local/src
RUN git clone https://github.com/simonmichael/hledger -b master
WORKDIR /usr/local/src/hledger
RUN stack update
RUN stack install --resolver="lts-22.28" --install-ghc --local-bin-path=/usr/local/bin
services:
dev-tools:
image: evergreencrypto/docker-finance:dev-tools
container_name: evergreencrypto_docker-finance_dev-tools
build:
dockerfile: Dockerfile.dev-tools
# TODO: add labels
# vim: sw=2 sts=2 si ai et

View File

@@ -0,0 +1,53 @@
# docker-finance | modern accounting for the power-user
#
# Copyright (C) 2021-2024 Aaron Fiore (Founder, Evergreen Crypto LLC)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
# Base dependencies
#
# https://hub.docker.com/evergreencrypto/hledger-suite
FROM evergreencrypto/hledger-suite:latest AS hledger-suite
# https://hub.docker.com/_/archlinux
FROM archlinux:base-devel
COPY --from=hledger-suite /usr/local/bin/hledger /usr/local/bin/hledger
COPY --from=hledger-suite /usr/local/bin/hledger-ui /usr/local/bin/hledger-ui
COPY --from=hledger-suite /usr/local/bin/hledger-web /usr/local/bin/hledger-web
COPY --from=hledger-suite /usr/local/bin/hledger-iadd /usr/local/bin/hledger-iadd
COPY --from=hledger-suite /usr/local/bin/hledger-flow /usr/local/bin/hledger-flow
RUN pacman -Syu --noconfirm --disable-download-timeout
RUN pacman -Syu \
bc \
csvkit \
vim \
xsv \
yq \
--noconfirm --disable-download-timeout
#
# Entrypoint
#
USER root
COPY ./entrypoint.bash /entrypoint.bash
RUN chmod a+rx /entrypoint.bash
ENTRYPOINT ["/entrypoint.bash"]
# vim: sw=2 sts=2 si ai et

View File

@@ -0,0 +1,56 @@
# docker-finance | modern accounting for the power-user
#
# Copyright (C) 2021-2024 Aaron Fiore (Founder, Evergreen Crypto LLC)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
# Base dependencies
#
# https://hub.docker.com/evergreencrypto/hledger-suite
FROM evergreencrypto/hledger-suite:latest AS hledger-suite
# https://hub.docker.com/_/ubuntu/
FROM ubuntu:rolling
COPY --from=hledger-suite /usr/local/bin/hledger /usr/local/bin/hledger
COPY --from=hledger-suite /usr/local/bin/hledger-ui /usr/local/bin/hledger-ui
COPY --from=hledger-suite /usr/local/bin/hledger-web /usr/local/bin/hledger-web
COPY --from=hledger-suite /usr/local/bin/hledger-iadd /usr/local/bin/hledger-iadd
COPY --from=hledger-suite /usr/local/bin/hledger-flow /usr/local/bin/hledger-flow
RUN apt-get update -y
RUN apt-get install -y \
bc \
csvkit \
gawk \
vim \
yq \
zlib1g-dev
RUN apt-get install -y cargo
RUN cargo install xsv --root /usr
#
# Entrypoint
#
USER root
COPY ./entrypoint.bash /entrypoint.bash
RUN chmod a+rx /entrypoint.bash
ENTRYPOINT ["/entrypoint.bash"]
# vim: sw=2 sts=2 si ai et

View File

@@ -0,0 +1,31 @@
# docker-finance | modern accounting for the power-user
#
# Copyright (C) 2024 Aaron Fiore (Founder, Evergreen Crypto LLC)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
services:
archlinux:
image: evergreencrypto/docker-finance:archlinux
container_name: evergreencrypto_docker-finance_archlinux
build:
dockerfile: Dockerfile.archlinux
ubuntu:
image: evergreencrypto/docker-finance:ubuntu
container_name: evergreencrypto_docker-finance_ubuntu
build:
dockerfile: Dockerfile.ubuntu
# TODO: add labels
# vim: sw=2 sts=2 si ai et

View File

@@ -0,0 +1,41 @@
#!/usr/bin/env bash
# docker-finance | modern accounting for the power-user
#
# Copyright (C) 2021-2024 Aaron Fiore (Founder, Evergreen Crypto LLC)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
# *** WARNING: REQUIRES GENERATED CLIENT ENVIRONMENT ***
#
if [ -z "$DOCKER_FINANCE_CONTAINER_REPO" ]; then
echo "FATAL: DOCKER_FINANCE_CONTAINER_REPO not set" >&2
exit 1
fi
if [ -z "$DOCKER_FINANCE_CONTAINER_FLOW" ]; then
echo "FATAL: DOCKER_FINANCE_CONTAINER_FLOW not set" >&2
exit 1
fi
# Dynamically connect hledger-flow source with end-user hledger-flow structure
# TODO: annoying, find a better way
ln -f -s "${DOCKER_FINANCE_CONTAINER_REPO}/src/hledger-flow" "${DOCKER_FINANCE_CONTAINER_FLOW}/src"
# Keep container running
tail -f /dev/null
exec "$@"

View File

@@ -0,0 +1,57 @@
# docker-finance | modern accounting for the power-user
#
# Copyright (C) 2021-2024 Aaron Fiore (Founder, Evergreen Crypto LLC)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
FROM haskell:latest
RUN apt-get update -y
RUN apt-get upgrade -y
#
# hledger-flow
#
WORKDIR /usr/local/src
RUN git clone --depth=1 https://github.com/apauley/hledger-flow -b v0.15.0
WORKDIR /usr/local/src/hledger-flow
RUN stack setup
RUN stack install --install-ghc --local-bin-path=/usr/local/bin
#
# hledger-iadd
#
WORKDIR /usr/local/src
RUN git clone --depth=1 https://github.com/hpdeifel/hledger-iadd -b v1.3.21
WORKDIR /usr/local/src/hledger-iadd
RUN sed -i 's/^ - hledger-lib-1\.32\.2/ - hledger-lib-1\.33\.1@sha256\:3920c9b273ecae8be59628b6f6f93fd1b4f3cee03a89fda23b0c4b183d0577f2\,7844/g' stack.yaml
RUN stack setup
RUN stack install --resolver="lts" --install-ghc --local-bin-path=/usr/local/bin hledger-iadd
#
# hledger / hledger-ui / hledger-web
#
WORKDIR /usr/local/src
RUN git clone --depth=1 https://github.com/simonmichael/hledger -b 1.40
WORKDIR /usr/local/src/hledger
RUN stack setup
RUN stack install --resolver="lts" --install-ghc --local-bin-path=/usr/local/bin
# vim: sw=2 sts=2 si ai et

View File

@@ -0,0 +1,24 @@
# docker-finance | modern accounting for the power-user
#
# Copyright (C) 2024 Aaron Fiore (Founder, Evergreen Crypto LLC)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
services:
hledger-suite:
image: evergreencrypto/hledger-suite:latest
container_name: evergreencrypto_hledger-suite
build: .
# vim: sw=2 sts=2 si ai et

View File

@@ -101,6 +101,10 @@ function lib_docker::__parse_args_build()
[ -z "$global_platform" ] && lib_utils::die_fatal
# Re-seat global usage for tag options
local _global_usage
_global_usage="$(echo $global_usage | cut -d: -f1)"
case "$global_platform" in
archlinux | ubuntu)
local -r _usage="
@@ -116,29 +120,28 @@ function lib_docker::__parse_args_build()
Build type:
type${global_arg_delim_2}<default|slim|tiny|micro|experimental>
\e[32mNotes:\e[0m
- All builds will continue to incorporate custom Dockerfile (see \`edit help\`)
- WARNING: for 'tiny' and 'micro'; use only if you trust pre-compiled assets hosted on GitHub (Microsoft)
type${global_arg_delim_2}<default|slim|tiny|micro>
\e[32mExamples:\e[0m
\e[37;2m# Build normal 'default' image\e[0m
$ $global_usage type${global_arg_delim_2}default
\e[37;2m# Build the latest 'default' image, tag as 'default'\e[0m
$ $_global_usage:default type${global_arg_delim_2}default
\e[37;2m# Build a smaller 'default' image but *without* ROOT.cern (meta-analysis) support\e[0m
$ $global_usage type${global_arg_delim_2}slim
\e[37;2m# Build the latest 'default' image *without* 'root' module (ROOT.cern), tag as 'slim'\e[0m
$ $_global_usage:slim type${global_arg_delim_2}slim
\e[37;2m# Build an even smaller 'default' image with *pre-built* hledger-flow binary (but *with* ROOT.cern support)\e[0m
$ $global_usage type${global_arg_delim_2}tiny
\e[37;2m# Build the latest 'slim' image *without* 'fetch' module (remote APIs), tag as 'tiny'\e[0m
$ $_global_usage:tiny type${global_arg_delim_2}tiny
\e[37;2m# Build the smallest image possible: the 'tiny' image *without* ROOT.cern support\e[0m
$ $global_usage type${global_arg_delim_2}micro
\e[37;2m# Build the latest 'tiny' image *without* 'track' support (time, metadata), tag as 'micro'\e[0m
$ $_global_usage:micro type${global_arg_delim_2}micro
\e[37;2m# Build experimental image based on 'default' image (WARNING: large image and possibly unstable)\e[0m
$ $global_usage type${global_arg_delim_2}experimental
\e[32mNotes:\e[0m
- Image tags are not connected to build type
(e.g., you can have an 'experimental' tag with a 'micro' image)
- All builds will continue to append your custom Dockerfile (see \`edit help\`)
"
;;
dev-tools)
@@ -163,8 +166,8 @@ function lib_docker::__parse_args_build()
\e[32mExamples:\e[0m
\e[37;2m# Build normal (default) image\e[0m
$ $global_usage type${global_arg_delim_2}default
\e[37;2m# Build the latest 'default' image, tag as default\e[0m
$ $_global_usage:default type${global_arg_delim_2}default
"
;;
*)
@@ -195,7 +198,7 @@ function lib_docker::__parse_args_build()
# Arg: type
if [ ! -z "$_arg_type" ]; then
[[ ! "$_arg_type" =~ ^default$|^slim$|^tiny$|^micro$|^experimental$ ]] \
[[ ! "$_arg_type" =~ ^default$|^slim$|^tiny$|^micro$ ]] \
&& lib_utils::die_usage "$_usage"
declare -gr global_arg_type="$_arg_type"
@@ -228,52 +231,67 @@ function lib_docker::__build()
"$_in_file" >"$_final" || return $?
#
# Append to Dockerfile according to type
# Append platform build modules according to build type
#
if [[ "$global_platform" == "dev-tools" && "$global_arg_type" != "default" ]]; then
lib_utils::print_warning "'${global_arg_type}' is not supported for 'dev-tools', using 'default'"
fi
local _files=()
if [[ "$global_platform" != "dev-tools" ]]; then
case "$global_platform" in
archlinux | ubuntu)
local -r _path="${global_repo_dockerfiles}/${global_platform}"
case "$global_arg_type" in
default)
_files+=("${_path}/Dockerfile.track.in")
_files+=("${_path}/Dockerfile.fetch.in")
_files+=("${_path}/Dockerfile.root.in")
_files+=("${_path}/Dockerfile.user.in")
;;
slim)
_files+=("${_path}/Dockerfile.track.in")
_files+=("${_path}/Dockerfile.fetch.in")
_files+=("${_path}/Dockerfile.user.in")
lib_utils::print_warning "not building module: 'root'"
;;
tiny)
_files+=("${_path}/Dockerfile.track.in")
_files+=("${_path}/Dockerfile.user.in")
lib_utils::print_warning "not building module: 'fetch'"
lib_utils::print_warning "not building module: 'root'"
;;
micro)
_files+=("${_path}/Dockerfile.user.in")
lib_utils::print_warning "not building module: 'track'"
lib_utils::print_warning "not building module: 'fetch'"
lib_utils::print_warning "not building module: 'root'"
;;
*)
lib_utils::die_fatal "unsupported build"
;;
esac
;;
dev-tools)
case "$global_arg_type" in
default)
local -r _path="${global_repo_dockerfiles}/ubuntu"
_files+=("${_path}/Dockerfile.user.in")
;;
*)
lib_utils::print_warning "'${global_arg_type}' is not supported for 'dev-tools', using 'default'"
;;
esac
;;
*)
lib_utils::die_fatal "unsupported platform"
;;
esac
local _files=()
local _path="${global_repo_dockerfiles}/${global_platform}"
case "$global_arg_type" in
default)
_files+=("${_path}/Dockerfile.hledger-flow.src.in")
_files+=("${_path}/Dockerfile.root.in")
;;
slim)
_files+=("${_path}/Dockerfile.hledger-flow.src.in")
;;
tiny)
_files+=("${_path}/Dockerfile.hledger-flow.bin.in")
_files+=("${_path}/Dockerfile.root.in")
;;
micro)
_files+=("${_path}/Dockerfile.hledger-flow.bin.in")
;;
experimental)
_path+="/experimental"
_files+=("${_path}/Dockerfile.hledger-flow.src.in")
_files+=("${_path}/Dockerfile.hledger.src.in")
_files+=("${_path}/Dockerfile.root.in")
;;
*)
lib_utils::die_fatal "unsupported build"
;;
esac
for _file in "${_files[@]}"; do
lib_utils::print_debug "Appending '${_file}' to '${_final}'"
sed \
-e "s:@DOCKER_FINANCE_USER@:${DOCKER_FINANCE_USER}:g" \
"$_file" >>"$_final" || return $?
done
fi
for _file in "${_files[@]}"; do
lib_utils::print_debug "Appending '${_file}' to '${_final}'"
sed \
-e "s:@DOCKER_FINANCE_UID@:${DOCKER_FINANCE_UID}:g" \
-e "s:@DOCKER_FINANCE_USER@:${DOCKER_FINANCE_USER}:g" \
"$_file" >>"$_final" || return $?
done
#
# Append to Dockerfile end-user's custom Dockerfile

View File

@@ -203,7 +203,7 @@ function lib_gen::__set_client_globals()
lib_utils::print_debug "global_platform_image=${global_platform_image}"
# Base location of Docker-related files (.in and final out files)
global_repo_dockerfiles="${DOCKER_FINANCE_CLIENT_REPO}/client/Dockerfiles/${global_platform_image}"
global_repo_dockerfiles="${DOCKER_FINANCE_CLIENT_REPO}/client/Dockerfiles/local/${global_platform_image}"
# shellcheck disable=SC2034 # used in lib_docker
declare -g global_repo_dockerfiles
lib_utils::print_debug "global_repo_dockerfiles=${global_repo_dockerfiles}"