diff --git a/docs/Docker-Image-Development.md b/docs/Docker-Image-Development.md new file mode 100644 index 00000000..3ebdf2f3 --- /dev/null +++ b/docs/Docker-Image-Development.md @@ -0,0 +1,4 @@ +# Getting Started + +The ```~/images/rafnav_bench/Dockerfile``` image is what is used for development. +Use and build the ```~/images/custom/Dockerfile``` for testing your own dockerfile to use. After testing is done you can copy it over to the rafnav_bench Dockerfile. diff --git a/images/bench/Dockerfile b/images/bench/Dockerfile deleted file mode 100644 index faaec0a2..00000000 --- a/images/bench/Dockerfile +++ /dev/null @@ -1,170 +0,0 @@ -FROM debian:bookworm-slim as bench - -LABEL author=frappé - -ARG GIT_REPO=https://github.com/frappe/bench.git -ARG GIT_BRANCH=v5.x - -RUN apt-get update \ - && DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y \ - # For frappe framework - git \ - mariadb-client \ - postgresql-client \ - gettext-base \ - wget \ - # for PDF - libssl-dev \ - fonts-cantarell \ - xfonts-75dpi \ - xfonts-base \ - # weasyprint dependencies - libpango-1.0-0 \ - libharfbuzz0b \ - libpangoft2-1.0-0 \ - libpangocairo-1.0-0 \ - # to work inside the container - locales \ - build-essential \ - cron \ - curl \ - vim \ - sudo \ - iputils-ping \ - watch \ - tree \ - nano \ - less \ - software-properties-common \ - bash-completion \ - # For psycopg2 - libpq-dev \ - # Other - libffi-dev \ - liblcms2-dev \ - libldap2-dev \ - libmariadb-dev \ - libsasl2-dev \ - libtiff5-dev \ - libwebp-dev \ - redis-tools \ - rlwrap \ - tk8.6-dev \ - ssh-client \ - # VSCode container requirements - net-tools \ - # For pyenv build dependencies - # https://github.com/frappe/frappe_docker/issues/840#issuecomment-1185206895 - make \ - # For pandas - libbz2-dev \ - # For bench execute - libsqlite3-dev \ - # For other dependencies - zlib1g-dev \ - libreadline-dev \ - llvm \ - libncurses5-dev \ - libncursesw5-dev \ - xz-utils \ - tk-dev \ - liblzma-dev \ - file \ - && rm -rf /var/lib/apt/lists/* - -RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen \ - && dpkg-reconfigure --frontend=noninteractive locales - -# Detect arch and install wkhtmltopdf -ARG WKHTMLTOPDF_VERSION=0.12.6.1-3 -ARG WKHTMLTOPDF_DISTRO=bookworm -RUN if [ "$(uname -m)" = "aarch64" ]; then export ARCH=arm64; fi \ - && if [ "$(uname -m)" = "x86_64" ]; then export ARCH=amd64; fi \ - && downloaded_file=wkhtmltox_${WKHTMLTOPDF_VERSION}.${WKHTMLTOPDF_DISTRO}_${ARCH}.deb \ - && wget -q https://github.com/wkhtmltopdf/packaging/releases/download/$WKHTMLTOPDF_VERSION/$downloaded_file \ - && dpkg -i $downloaded_file \ - && rm $downloaded_file - -# Create new user with home directory, improve docker compatibility with UID/GID 1000, -# add user to sudo group, allow passwordless sudo, switch to that user -# and change directory to user home directory -RUN groupadd -g 1000 frappe \ - && useradd --no-log-init -r -m -u 1000 -g 1000 -G sudo frappe \ - && echo "frappe ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers - -USER frappe -WORKDIR /home/frappe - -# Install Python via pyenv -ENV PYTHON_VERSION_V14=3.10.13 -ENV PYTHON_VERSION=3.12.3 -ENV PYENV_ROOT /home/frappe/.pyenv -ENV PATH $PYENV_ROOT/shims:$PYENV_ROOT/bin:$PATH - -# From https://github.com/pyenv/pyenv#basic-github-checkout -RUN git clone --depth 1 https://github.com/pyenv/pyenv.git .pyenv \ - && pyenv install $PYTHON_VERSION_V14 \ - && pyenv install $PYTHON_VERSION \ - && PYENV_VERSION=$PYTHON_VERSION_V14 pip install --no-cache-dir virtualenv \ - && PYENV_VERSION=$PYTHON_VERSION pip install --no-cache-dir virtualenv \ - && pyenv global $PYTHON_VERSION $PYTHON_VERSION_v14 \ - && sed -Ei -e '/^([^#]|$)/ {a export PYENV_ROOT="/home/frappe/.pyenv" a export PATH="$PYENV_ROOT/bin:$PATH" a ' -e ':a' -e '$!{n;ba};}' ~/.profile \ - && echo 'eval "$(pyenv init --path)"' >>~/.profile \ - && echo 'eval "$(pyenv init -)"' >>~/.bashrc - -# Clone and install bench in the local user home directory -# For development, bench source is located in ~/.bench -ENV PATH /home/frappe/.local/bin:$PATH -# Skip editable-bench warning -# https://github.com/frappe/bench/commit/20560c97c4246b2480d7358c722bc9ad13606138 -RUN git clone ${GIT_REPO} --depth 1 -b ${GIT_BRANCH} .bench \ - && pip install --no-cache-dir --user -e .bench \ - && echo "export PATH=/home/frappe/.local/bin:\$PATH" >>/home/frappe/.bashrc \ - && echo "export BENCH_DEVELOPER=1" >>/home/frappe/.bashrc - -# Install homebrew and wget -RUN /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" \ - && (echo; echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"') >> /home/frappe/.profile \ - && eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" \ - && brew install gcc \ - && brew install wget - -# Add aliases -RUN touch $HOME/.bash_aliases \ - && echo "alias py='python'" >> $HOME/.bash_aliases \ - && echo "alias frap-install='py installer.py'" >> $HOME/.bash_aliases - -# Install Node via nvm -ENV NODE_VERSION_STABLE=16.20.2 -ENV NODE_VERSION=20.13.1 -ENV NVM_DIR /home/frappe/.nvm -ENV PATH ${NVM_DIR}/versions/node/v${NODE_VERSION}/bin/:${PATH} - -RUN wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash \ - && . ${NVM_DIR}/nvm.sh \ - && nvm install ${NODE_VERSION_STABLE} \ - && nvm use v${NODE_VERSION_STABLE} \ - && npm install -g yarn \ - && nvm install v${NODE_VERSION} \ - && npm install -g yarn \ - && rm -rf ${NVM_DIR}/.cache \ - && echo 'export NVM_DIR="/home/frappe/.nvm"' >>~/.bashrc \ - && echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm' >> ~/.bashrc \ - && echo '[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion' >> ~/.bashrc - -EXPOSE 8000-8005 9000-9005 6787 - -FROM bench as bench-test - -# Print version and verify bashrc is properly sourced so that everything works -# in the interactive shell and Dockerfile - -RUN node --version \ - && npm --version \ - && yarn --version \ - && bench --help - -RUN bash -c "node --version" \ - && bash -c "npm --version" \ - && bash -c "yarn --version" \ - && bash -c "bench --help" diff --git a/images/custom/Containerfile b/images/custom/Containerfile deleted file mode 100644 index 8190ef60..00000000 --- a/images/custom/Containerfile +++ /dev/null @@ -1,167 +0,0 @@ -ARG PYTHON_VERSION=3.12.3 -ARG DEBIAN_BASE=bookworm -FROM python:${PYTHON_VERSION}-slim-${DEBIAN_BASE} AS base - -COPY resources/nginx-template.conf /templates/nginx/frappe.conf.template -COPY resources/nginx-entrypoint.sh /usr/local/bin/nginx-entrypoint.sh - -ARG WKHTMLTOPDF_VERSION=0.12.6.1-3 -ARG WKHTMLTOPDF_DISTRO=bookworm -ARG NODE_VERSION=18.18.2 -ENV NVM_DIR=/home/frappe/.nvm -ENV PATH ${NVM_DIR}/versions/node/v${NODE_VERSION}/bin/:${PATH} - -RUN useradd -ms /bin/bash frappe \ - && apt-get update \ - && apt-get install --no-install-recommends -y \ - curl \ - git \ - vim \ - nginx \ - gettext-base \ - file \ - # weasyprint dependencies - libpango-1.0-0 \ - libharfbuzz0b \ - libpangoft2-1.0-0 \ - libpangocairo-1.0-0 \ - # For backups - restic \ - gpg \ - # MariaDB - mariadb-client \ - less \ - # Postgres - libpq-dev \ - postgresql-client \ - # For healthcheck - wait-for-it \ - jq \ - # NodeJS - && mkdir -p ${NVM_DIR} \ - && curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash \ - && . ${NVM_DIR}/nvm.sh \ - && nvm install ${NODE_VERSION} \ - && nvm use v${NODE_VERSION} \ - && npm install -g yarn \ - && nvm install --lts \ - && rm -rf ${NVM_DIR}/.cache \ - && echo 'export NVM_DIR="/home/frappe/.nvm"' >>/home/frappe/.bashrc \ - && echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm' >>/home/frappe/.bashrc \ - && echo '[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion' >>/home/frappe/.bashrc \ - # Install wkhtmltopdf with patched qt - && if [ "$(uname -m)" = "aarch64" ]; then export ARCH=arm64; fi \ - && if [ "$(uname -m)" = "x86_64" ]; then export ARCH=amd64; fi \ - && downloaded_file=wkhtmltox_${WKHTMLTOPDF_VERSION}.${WKHTMLTOPDF_DISTRO}_${ARCH}.deb \ - && curl -sLO https://github.com/wkhtmltopdf/packaging/releases/download/$WKHTMLTOPDF_VERSION/$downloaded_file \ - && apt-get install -y ./$downloaded_file \ - && rm $downloaded_file \ - # Clean up - && rm -rf /var/lib/apt/lists/* \ - && rm -fr /etc/nginx/sites-enabled/default \ - && pip3 install frappe-bench \ - # Fixes for non-root nginx and logs to stdout - && sed -i '/user www-data/d' /etc/nginx/nginx.conf \ - && ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log \ - && touch /run/nginx.pid \ - && chown -R frappe:frappe /etc/nginx/conf.d \ - && chown -R frappe:frappe /etc/nginx/nginx.conf \ - && chown -R frappe:frappe /var/log/nginx \ - && chown -R frappe:frappe /var/lib/nginx \ - && chown -R frappe:frappe /run/nginx.pid \ - && chmod 755 /usr/local/bin/nginx-entrypoint.sh \ - && chmod 644 /templates/nginx/frappe.conf.template - -# Install homebrew and wget -RUN /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" \ - && brew install wget - -# Add aliases -RUN touch $HOME/.bash_aliases \ - && echo "alias py='python'" >> $HOME/.bash_aliases \ - && echo "alias frap-install='py installer.py'" >> $HOME/.bash_aliases - -FROM base AS builder - -RUN apt-get update \ - && DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y \ - # For frappe framework - wget \ - #for building arm64 binaries - libcairo2-dev \ - libpango1.0-dev \ - libjpeg-dev \ - libgif-dev \ - librsvg2-dev \ - # For psycopg2 - libpq-dev \ - # Other - libffi-dev \ - liblcms2-dev \ - libldap2-dev \ - libmariadb-dev \ - libsasl2-dev \ - libtiff5-dev \ - libwebp-dev \ - redis-tools \ - rlwrap \ - tk8.6-dev \ - cron \ - # For pandas - gcc \ - build-essential \ - libbz2-dev \ - && rm -rf /var/lib/apt/lists/* - -# apps.json includes -ARG APPS_JSON_BASE64 -RUN if [ -n "${APPS_JSON_BASE64}" ]; then \ - mkdir /opt/frappe && echo "${APPS_JSON_BASE64}" | base64 -d > /opt/frappe/apps.json; \ - fi - -USER frappe - -ARG FRAPPE_BRANCH=version-15 -ARG FRAPPE_PATH=https://github.com/frappe/frappe -RUN export APP_INSTALL_ARGS="" && \ - if [ -n "${APPS_JSON_BASE64}" ]; then \ - export APP_INSTALL_ARGS="--apps_path=/opt/frappe/apps.json"; \ - fi && \ - bench init ${APP_INSTALL_ARGS}\ - --frappe-branch=${FRAPPE_BRANCH} \ - --frappe-path=${FRAPPE_PATH} \ - --no-procfile \ - --no-backups \ - --skip-redis-config-generation \ - --verbose \ - /home/frappe/frappe-bench && \ - cd /home/frappe/frappe-bench && \ - echo "{}" > sites/common_site_config.json && \ - find apps -mindepth 1 -path "*/.git" | xargs rm -fr - -FROM base as backend - -USER frappe - -COPY --from=builder --chown=frappe:frappe /home/frappe/frappe-bench /home/frappe/frappe-bench - -WORKDIR /home/frappe/frappe-bench - -VOLUME [ \ - "/home/frappe/frappe-bench/sites", \ - "/home/frappe/frappe-bench/sites/assets", \ - "/home/frappe/frappe-bench/logs" \ -] - -CMD [ \ - "/home/frappe/frappe-bench/env/bin/gunicorn", \ - "--chdir=/home/frappe/frappe-bench/sites", \ - "--bind=0.0.0.0:8000", \ - "--threads=4", \ - "--workers=2", \ - "--worker-class=gthread", \ - "--worker-tmp-dir=/dev/shm", \ - "--timeout=120", \ - "--preload", \ - "frappe.app:application" \ -]