-
Notifications
You must be signed in to change notification settings - Fork 29
Blog: customizing the docker build bake hcl file #345
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 22 commits
453ea3f
d4e7b01
f5bb741
7076d54
846168f
a4e4c51
87242a9
917dabb
1c4d12d
57b86d4
c388904
078791f
0d00386
72ba46f
868ac84
3806a39
2e21542
5a24ba7
19edf8c
eb4a8f4
59e9397
dff8111
38fec5e
3c7d7b2
40702d9
17c5d6e
fb5a83d
45706cf
4f3dba7
49a7fec
a0e2430
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| --- | ||
| name: Daniel Chambre | ||
| avatar: daniel.jpg | ||
| github: smiyc | ||
| --- | ||
|
|
||
| A DBA and Open Source enthusiast. | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,73 @@ | ||
| variable "environment" { | ||
| default = "production" | ||
| } | ||
|
|
||
| variable "registry" { | ||
| default = "your.repo.url/cnpg" | ||
| } | ||
|
|
||
| platforms = [ | ||
| "linux/amd64", | ||
| ] | ||
|
|
||
| extensions = [ | ||
| "dbgsym", | ||
| "partman", | ||
| "oracle-fdw", | ||
| "squeeze", | ||
| "show-plans", | ||
| "cron", | ||
| "tds-fdw", | ||
| ] | ||
|
|
||
| target "myimage" { | ||
| dockerfile-inline = <<EOT | ||
| ARG BASE_IMAGE="ghcr.io/cloudnative-pg/postgresql:16.9-standard-bookworm" | ||
| FROM $BASE_IMAGE AS myimage | ||
| ARG EXTENSIONS | ||
| USER root | ||
| RUN apt-get update && \ | ||
| apt-get install -y --no-install-recommends $EXTENSIONS \ | ||
| ldap-utils \ | ||
| ca-certificates \ | ||
| openssl \ | ||
| procps \ | ||
| postgresql-plpython3-"${getMajor(pgVersion)}" \ | ||
| python3-psutil \ | ||
| pgtop \ | ||
| pg-activity \ | ||
| nmon \ | ||
| libsybdb5 \ | ||
| freetds-dev \ | ||
| freetds-common && \ | ||
| apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false && \ | ||
| rm -rf /var/lib/apt/lists/* /var/cache/* /var/log/* | ||
| RUN sed -i -e 's/# de_AT.UTF-8 UTF-8/de_AT.UTF-8 UTF-8/' /etc/locale.gen && \ | ||
| locale-gen | ||
| ADD https://your.git.url/postgresql/-/blob/main/.psqlrc?ref_type=heads /var/lib/postgresql/ | ||
| ADD https://your.git.url/cloudnativepg/-/blob/main/bake/files/etc/ldap/ldap.conf?ref_type=heads /etc/ldap/ | ||
| ADD https://your.git.url/cloudnativepg/-/blob/main/bake/files/usr/local/share/ca-certificates/EuropeanSSLServerCA2.crt?ref_type=heads /usr/local/share/ca-certificates/ | ||
| ADD https://your.git.url/cloudnativepg/-/blob/main/bake/files/usr/local/share/ca-certificates/RootCA1v0.crt?ref_type=heads /usr/local/share/ca-certificates/ | ||
| ADD https://your.git.url/cloudnativepg/-/blob/main/bake/files/usr/local/share/ca-certificates/SubCA1v1.crt?ref_type=heads /usr/local/share/ca-certificates/ | ||
| RUN update-ca-certificates | ||
| USER 26 | ||
| EOT | ||
| matrix = { | ||
| tgt = [ | ||
| "myimage" | ||
| ] | ||
| pgVersion = [ | ||
| "13.21", | ||
| "14.18", | ||
| "15.13", | ||
| "16.9", | ||
| "17.5", | ||
| ] | ||
| } | ||
| name = "postgresql-${index(split(".",cleanVersion(pgVersion)),0)}-standard-bookworm" | ||
| target = "${tgt}" | ||
| args = { | ||
| BASE_IMAGE = "ghcr.io/cloudnative-pg/postgresql:${cleanVersion(pgVersion)}-standard-bookworm", | ||
| EXTENSIONS = "${getExtensionsString(pgVersion, extensions)}", | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,164 @@ | ||
| --- | ||
| title: "Customizing the docker build bake hcl file" | ||
| date: 2025-08-02 | ||
| draft: true | ||
FloorD marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| image: | ||
| url: elephant_cookie.jpg | ||
| attribution: https://www.wallpaperflare.com/cookies-elephant-breakfast-for-children-dessert-food-sweet-food-wallpaper-asujf/download | ||
| author: dchambre | ||
jsilvela marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| tags: | ||
| - blog | ||
| - information | ||
| - programming | ||
| - applications | ||
| - containers | ||
| - postgresql | ||
| - postgres | ||
| - images | ||
| - tutorial | ||
| - bake | ||
| - docker | ||
| summary: How I used Jonathan's blog post to create an hcl for my needs. | ||
smiyc marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| --- | ||
|
|
||
| ## Summary | ||
|
|
||
| The other week [Jonathan Gonzalez]({{% ref "/authors/jgonzalez/" %}}) wrote an | ||
| article on | ||
| [how to customize docker images using an override hcl file]({{% ref "/blog/building-images-bake/" %}}) . | ||
| Before the [postgres-containers repo](https://github.com/cloudnative-pg/postgres-containers) | ||
| I had to follow these steps manually in order to have custom images for our workloads. | ||
|
|
||
| - clone the repo | ||
| - edit the dockerfile | ||
| - build the image | ||
| - push it to the registry | ||
|
|
||
| Edit, build and push had to be done for each PostgreSQL version. | ||
| So a lot of boring work needed to be done in order to have updated images. | ||
| The chance to avoid this work sounded promising to me, so I started with the | ||
| [hcl file](https://raw.githubusercontent.com/cloudnative-pg/cloudnative-pg.github.io/refs/heads/main/content/blog/building-images-bake/bake.hcl) | ||
| Jonathan wrote, and adapted it to fit my needs. | ||
| After a troubleshooting session with Jonathan, he asked me to share the changes I made. | ||
| So here are my detailed instructions, in case they could prove useful to others. | ||
|
|
||
| ## Instructions | ||
|
|
||
| ### Step 1: Prepare the local Bake file | ||
|
|
||
| To build a custom image we add the following content in a local file with name | ||
| `bake.hcl`: | ||
|
|
||
| ```hcl | ||
| variable "environment" { | ||
| default = "production" | ||
| } | ||
|
|
||
| variable "registry" { | ||
| default = "your.repo.url/cnpg" | ||
| } | ||
|
||
|
|
||
| platforms = [ | ||
| "linux/amd64", | ||
| ] | ||
|
|
||
| extensions = [ | ||
| "dbgsym", | ||
| "partman", | ||
| "oracle-fdw", | ||
| "squeeze", | ||
| "show-plans", | ||
| "cron", | ||
| "tds-fdw", | ||
| ] | ||
|
|
||
| target "myimage" { | ||
| dockerfile-inline = <<EOT | ||
| ARG BASE_IMAGE="ghcr.io/cloudnative-pg/postgresql:16.9-standard-bookworm" | ||
| FROM $BASE_IMAGE AS myimage | ||
| ARG EXTENSIONS | ||
| USER root | ||
| RUN apt-get update && \ | ||
| apt-get install -y --no-install-recommends $EXTENSIONS \ | ||
| ldap-utils \ | ||
| ca-certificates \ | ||
| openssl \ | ||
| procps \ | ||
| postgresql-plpython3-"${getMajor(pgVersion)}" \ | ||
| python3-psutil \ | ||
| pgtop \ | ||
| pg-activity \ | ||
| nmon \ | ||
| libsybdb5 \ | ||
| freetds-dev \ | ||
| freetds-common && \ | ||
| apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false && \ | ||
| rm -rf /var/lib/apt/lists/* /var/cache/* /var/log/* | ||
| RUN sed -i -e 's/# de_AT.UTF-8 UTF-8/de_AT.UTF-8 UTF-8/' /etc/locale.gen && \ | ||
| locale-gen | ||
| ADD https://your.git.url/postgresql/-/blob/main/.psqlrc?ref_type=heads /var/lib/postgresql/ | ||
| ADD https://your.git.url/cloudnativepg/-/blob/main/bake/files/etc/ldap/ldap.conf?ref_type=heads /etc/ldap/ | ||
| ADD https://your.git.url/cloudnativepg/-/blob/main/bake/files/usr/local/share/ca-certificates/EuropeanSSLServerCA2.crt?ref_type=heads /usr/local/share/ca-certificates/ | ||
| ADD https://your.git.url/cloudnativepg/-/blob/main/bake/files/usr/local/share/ca-certificates/RootCA1v0.crt?ref_type=heads /usr/local/share/ca-certificates/ | ||
| ADD https://your.git.url/cloudnativepg/-/blob/main/bake/files/usr/local/share/ca-certificates/SubCA1v1.crt?ref_type=heads /usr/local/share/ca-certificates/ | ||
| RUN update-ca-certificates | ||
| USER 26 | ||
| EOT | ||
| matrix = { | ||
| tgt = [ | ||
| "myimage" | ||
| ] | ||
| pgVersion = [ | ||
| "13.21", | ||
| "14.18", | ||
| "15.13", | ||
| "16.9", | ||
| "17.5", | ||
| ] | ||
| } | ||
| name = "postgresql-${index(split(".",cleanVersion(pgVersion)),0)}-standard-bookworm" | ||
| target = "${tgt}" | ||
| args = { | ||
| BASE_IMAGE = "ghcr.io/cloudnative-pg/postgresql:${cleanVersion(pgVersion)}-standard-bookworm", | ||
| EXTENSIONS = "${getExtensionsString(pgVersion, extensions)}", | ||
| } | ||
| } | ||
| ``` | ||
|
|
||
| Starting at the beginning of the file: | ||
|
|
||
| - The `environment` variable is set to `production` for all of my images, | ||
| because I use the same image to stage it through dev/test/prod. | ||
| - The `registry` variable contains the repo upload url, so I don't have to add | ||
| this information every time I build an image. | ||
| - The `platforms` variable is `linux/amd64` for all of my images. | ||
| - The `extensions` variable contains some extensions I use regularly. | ||
| - The `dockerfile-inline` part is extended with binaries, some of them are handy | ||
| to have, some needed by extensions or other tools I use e.g. [pgwatch](https://github.com/cybertec-postgresql/pgwatch). | ||
| - With the `sed` command I add needed locales and build them. | ||
| - With the `ADD` commands I extend the image with | ||
| - .psqlrc file, to have a nice psql Command-line even when connecting via | ||
| `kubectl cnpg psql XXX` | ||
| - ldap.conf and the needed certs | ||
|
|
||
| ### Step 2: Build the image | ||
|
|
||
| We can now build the image using the following command: | ||
|
|
||
| ```bash | ||
| docker buildx bake -f docker-bake.hcl -f cwd://bake.hcl "https://github.com/cloudnative-pg/postgres-containers.git" myimage | ||
| ``` | ||
|
|
||
| ### Step 3: Use it | ||
|
|
||
| The only missing step to use the images is to update your | ||
| [Image Catalog / Cluster Image Catalog](https://cloudnative-pg.io/documentation/current/image_catalog/) | ||
| with the newly built images. | ||
| Test them and stage them through your environment. | ||
|
|
||
| ## Conclusion | ||
|
|
||
| Once you prepare the override file to fit to your needs, the only manual steps | ||
| to build new images are | ||
| - udpate the `pgVersion` variable | ||
| - run the `docker buildx bake` command | ||
smiyc marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
smiyc marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
Uh oh!
There was an error while loading. Please reload this page.