2
0
mirror of https://github.com/frappe/frappe_docker.git synced 2024-12-22 10:08:56 +00:00

docs: quick build command (#1500)

* docs: quick build command

* chore: fix pre-commit lint for md file
This commit is contained in:
Revant Nandgaonkar 2024-10-27 14:45:41 +05:30 committed by GitHub
parent 3d6fb8c4b1
commit a919f44505
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 69 additions and 51 deletions

View File

@ -1,16 +1,11 @@
### Clone frappe_docker and switch directory ### Load custom apps through apps.json file
```shell Base64 encoded string of `apps.json` file needs to be passed in as build arg environment variable.
git clone https://github.com/frappe/frappe_docker
cd frappe_docker
```
### Load custom apps through json Create following `apps.json` file:
`apps.json` needs to be passed in as build arg environment variable. ```json
[
```shell
export APPS_JSON='[
{ {
"url": "https://github.com/frappe/erpnext", "url": "https://github.com/frappe/erpnext",
"branch": "version-15" "branch": "version-15"
@ -23,12 +18,16 @@ export APPS_JSON='[
"url": "https://{{ PAT }}@git.example.com/project/repository.git", "url": "https://{{ PAT }}@git.example.com/project/repository.git",
"branch": "main" "branch": "main"
} }
]' ]
export APPS_JSON_BASE64=$(echo ${APPS_JSON} | base64 -w 0)
``` ```
You can also generate base64 string from json file: Note:
- `url` needs to be http(s) git url with personal access tokens without username eg:- `http://{{PAT}}@github.com/project/repository.git` in case of private repo.
- Add dependencies manually in `apps.json` e.g. add `erpnext` if you are installing `hrms`.
- Use fork repo or branch for ERPNext in case you need to use your fork or test a PR.
Generate base64 string from json file:
```shell ```shell
export APPS_JSON_BASE64=$(base64 -w 0 /path/to/apps.json) export APPS_JSON_BASE64=$(base64 -w 0 /path/to/apps.json)
@ -36,7 +35,7 @@ export APPS_JSON_BASE64=$(base64 -w 0 /path/to/apps.json)
Test the Previous Step: Decode the Base64-encoded Environment Variable Test the Previous Step: Decode the Base64-encoded Environment Variable
To verify the previous step, decode the APPS_JSON_BASE64 environment variable (which is Base64-encoded) into a JSON file. Follow the steps below: To verify the previous step, decode the `APPS_JSON_BASE64` environment variable (which is Base64-encoded) into a JSON file. Follow the steps below:
1. Use the following command to decode and save the output into a JSON file named apps-test-output.json: 1. Use the following command to decode and save the output into a JSON file named apps-test-output.json:
@ -46,29 +45,48 @@ echo -n ${APPS_JSON_BASE64} | base64 -d > apps-test-output.json
2. Open the apps-test-output.json file to review the JSON output and ensure that the content is correct. 2. Open the apps-test-output.json file to review the JSON output and ensure that the content is correct.
Note: ### Clone frappe_docker and switch directory
- `url` needs to be http(s) git url with personal access tokens without username eg:- http://{{PAT}}@github.com/project/repository.git in case of private repo.
- add dependencies manually in `apps.json` e.g. add `payments` if you are installing `erpnext`
- use fork repo or branch for ERPNext in case you need to use your fork or test a PR.
### Build Image
```shell ```shell
docker build \ git clone https://github.com/frappe/frappe_docker
--build-arg=APPS_JSON_BASE64=$APPS_JSON_BASE64 \ cd frappe_docker
--tag=ghcr.io/user/repo/custom:1.0.0 \
--file=images/custom/Containerfile .
``` ```
Note: ### Configure build
- Use `buildah` instead of `docker` as per your setup. Common build args.
- `FRAPPE_PATH`, customize the source repo for frappe framework. Defaults to `https://github.com/frappe/frappe`
- `FRAPPE_BRANCH`, customize the source repo branch for frappe framework. Defaults to `version-15`.
- `APPS_JSON_BASE64`, correct base64 encoded JSON string generated from `apps.json` file.
Notes
- Use `buildah` or `docker` as per your setup.
- Make sure `APPS_JSON_BASE64` variable has correct base64 encoded JSON string. It is consumed as build arg, base64 encoding ensures it to be friendly with environment variables. Use `jq empty apps.json` to validate `apps.json` file. - Make sure `APPS_JSON_BASE64` variable has correct base64 encoded JSON string. It is consumed as build arg, base64 encoding ensures it to be friendly with environment variables. Use `jq empty apps.json` to validate `apps.json` file.
- Make sure the `--tag` is valid image name that will be pushed to registry. See section [below](#use-images) for remarks about its use. - Make sure the `--tag` is valid image name that will be pushed to registry. See section [below](#use-images) for remarks about its use.
- `.git` directories for all apps are removed from the image. - `.git` directories for all apps are removed from the image.
Customize these optional `--build-arg`s to use a different Frappe Framework repo and branch, or version of Python and NodeJS: ### Quick build image
This method uses pre-built `frappe/base:${FRAPPE_BRANCH}` and `frappe/build:${FRAPPE_BRANCH}` image layers which come with required Python and NodeJS runtime. It speeds up the build time.
It uses `images/layered/Containerfile`.
```shell
docker build \
--build-arg=FRAPPE_PATH=https://github.com/frappe/frappe \
--build-arg=FRAPPE_BRANCH=version-15 \
--build-arg=APPS_JSON_BASE64=$APPS_JSON_BASE64 \
--tag=ghcr.io/user/repo/custom:1.0.0 \
--file=images/layered/Containerfile .
```
### Custom build image
This method builds the base and build layer every time, it allows to customize Python and NodeJS runtime versions. It takes more time to build.
It uses `images/custom/Containerfile`.
```shell ```shell
docker build \ docker build \
@ -81,39 +99,28 @@ docker build \
--file=images/custom/Containerfile . --file=images/custom/Containerfile .
``` ```
Custom build args,
- `PYTHON_VERSION`, use the specified python version for base image. Default is `3.11.6`.
- `NODE_VERSION`, use the specified nodejs version, Default `18.18.2`.
- `DEBIAN_BASE` use the base Debian version, defaults to `bookworm`.
- `WKHTMLTOPDF_VERSION`, use the specified qt patched `wkhtmltopdf` version. Default is `0.12.6.1-3`.
- `WKHTMLTOPDF_DISTRO`, use the specified distro for debian package. Default is `bookworm`.
### Push image to use in yaml files ### Push image to use in yaml files
Login to `docker` or `buildah` Login to `docker` or `buildah`
```shell ```shell
buildah login docker login
``` ```
Push image Push image
```shell ```shell
buildah push ghcr.io/user/repo/custom:1.0.0 docker push ghcr.io/user/repo/custom:1.0.0
``` ```
### Use Kaniko
Following executor args are required. Example runs locally in docker container.
You can run it part of CI/CD or part of your cluster.
```shell
podman run --rm -it \
-v "$HOME"/.docker/config.json:/kaniko/.docker/config.json \
gcr.io/kaniko-project/executor:latest \
--dockerfile=images/custom/Containerfile \
--context=git://github.com/frappe/frappe_docker \
--build-arg=APPS_JSON_BASE64=$APPS_JSON_BASE64 \
--cache=true \
--destination=ghcr.io/user/repo/custom:1.0.0 \
--destination=ghcr.io/user/repo/custom:latest
```
More about [kaniko](https://github.com/GoogleContainerTools/kaniko)
### Use Images ### Use Images
In the [compose.yaml](../compose.yaml), you can set the image name and tag through environment variables, making it easier to customize. In the [compose.yaml](../compose.yaml), you can set the image name and tag through environment variables, making it easier to customize.

View File

@ -1,8 +1,19 @@
ARG FRAPPE_BRANCH=version-15 ARG FRAPPE_BRANCH=version-15
ARG FRAPPE_PATH=https://github.com/frappe/frappe
FROM frappe/build:${FRAPPE_BRANCH} AS builder FROM frappe/build:${FRAPPE_BRANCH} AS builder
ARG FRAPPE_BRANCH=version-15
ARG FRAPPE_PATH=https://github.com/frappe/frappe
ARG APPS_JSON_BASE64
USER root
RUN if [ -n "${APPS_JSON_BASE64}" ]; then \
mkdir /opt/frappe && echo "${APPS_JSON_BASE64}" | base64 -d > /opt/frappe/apps.json; \
fi
USER frappe
RUN export APP_INSTALL_ARGS="" && \ RUN export APP_INSTALL_ARGS="" && \
if [ -n "${APPS_JSON_BASE64}" ]; then \ if [ -n "${APPS_JSON_BASE64}" ]; then \
export APP_INSTALL_ARGS="--apps_path=/opt/frappe/apps.json"; \ export APP_INSTALL_ARGS="--apps_path=/opt/frappe/apps.json"; \