Skip to content
Merged
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
453ea3f
docs: customice hcl file
smiyc Jul 27, 2025
d4e7b01
rename directory and add summary
smiyc Jul 27, 2025
f5bb741
pgvector is not needed in the hcl, since is defined in the original h…
smiyc Aug 1, 2025
7076d54
minor change
smiyc Aug 1, 2025
846168f
add image
smiyc Aug 2, 2025
a4e4c51
minor changes
smiyc Aug 2, 2025
87242a9
example tools
smiyc Aug 2, 2025
917dabb
Update content/blog/customizing-hcl/index.md
smiyc Aug 4, 2025
1c4d12d
Update content/blog/customizing-hcl/index.md
smiyc Aug 4, 2025
57b86d4
Update content/blog/customizing-hcl/index.md
smiyc Aug 4, 2025
c388904
more context
smiyc Aug 4, 2025
078791f
col80
smiyc Aug 5, 2025
0d00386
Update content/blog/customizing-hcl/index.md
smiyc Aug 5, 2025
72ba46f
Update content/blog/customizing-hcl/index.md
smiyc Aug 5, 2025
868ac84
Update content/blog/customizing-hcl/index.md
smiyc Aug 5, 2025
3806a39
Update content/blog/customizing-hcl/index.md
smiyc Aug 5, 2025
2e21542
Update content/blog/customizing-hcl/index.md
smiyc Aug 5, 2025
5a24ba7
Update content/blog/customizing-hcl/index.md
smiyc Aug 5, 2025
19edf8c
update with suggestions
smiyc Aug 6, 2025
eb4a8f4
Merge branch 'my_baking_recepie' of https://github.com/smiyc/cloudnat…
smiyc Aug 6, 2025
59e9397
update and remove package-lock.json
smiyc Aug 6, 2025
dff8111
Apply suggestions from code review
FloorD Aug 7, 2025
38fec5e
more context
smiyc Aug 8, 2025
3c7d7b2
remove spaces and bring back a missing line
smiyc Aug 10, 2025
40702d9
add blank lines
smiyc Aug 10, 2025
17c5d6e
move environmen&registry variables from the hcl file to the bake command
smiyc Aug 11, 2025
fb5a83d
straightened enumerations
smiyc Aug 11, 2025
45706cf
Update content/authors/dchambre/index.md
smiyc Aug 20, 2025
4f3dba7
Update content/blog/customizing-hcl/index.md
jsilvela Aug 20, 2025
49a7fec
Merge branch 'cloudnative-pg:main' into my_baking_recepie
smiyc Aug 21, 2025
a0e2430
Update index.md
FloorD Aug 22, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added content/authors/dchambre/daniel.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 7 additions & 0 deletions content/authors/dchambre/index.md
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.
73 changes: 73 additions & 0 deletions content/blog/customizing-hcl/bake.hcl
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)}",
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
164 changes: 164 additions & 0 deletions content/blog/customizing-hcl/index.md
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
image:
url: elephant_cookie.jpg
attribution: https://www.wallpaperflare.com/cookies-elephant-breakfast-for-children-dessert-food-sweet-food-wallpaper-asujf/download
author: dchambre
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.
---

## 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"
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you don't need this since those variables are already defined in the parent bake file =)

Copy link
Contributor Author

@smiyc smiyc Aug 7, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no sir, when I remove both the variables are

$ docker buildx bake -f docker-bake.hcl -f cwd://bake_bookworm.hcl "https://github.com/cloudnative-pg/postgres-containers.git" myimage --push --builder=container --list=variables
[+] Building 0.7s (2/2) FINISHED                                                                                                                                                                                                                               docker-container:container
 => CACHED [internal] load git source https://github.com/cloudnative-pg/postgres-containers.git                                                                                                                                                                                      0.6s
 => [internal] load local bake definitions                                                                                                                                                                                                                                           0.0s
 => => reading bake_bookworm.hcl 3.15kB / 3.15kB                                                                                                                                                                                                                                     0.0s
VARIABLE        TYPE    VALUE           DESCRIPTION                                                                                                                                                                                                                                       
environment		testing		
registry		localhost:5000	
revision		

with both in place

$ docker buildx bake -f docker-bake.hcl -f cwd://bake_bookworm.hcl "https://github.com/cloudnative-pg/postgres-containers.git" myimage --push --builder=container --list=variables
[+] Building 0.7s (2/2) FINISHED                                                                                                                                                                                                                               docker-container:container
 => CACHED [internal] load git source https://github.com/cloudnative-pg/postgres-containers.git                                                                                                                                                                                      0.6s
 => [internal] load local bake definitions                                                                                                                                                                                                                                           0.0s
 => => reading bake_bookworm.hcl 3.15kB / 3.15kB                                                                                                                                                                                                                                     0.0s
VARIABLE        TYPE    VALUE                                   DESCRIPTION                                                                                                                                                                                                               
environment		testing					
registry		XXX/cnpg	
revision		

so when I remove environmen and registry from my bake file, the image will be uploaded to localhost:5000 and the subdirectory will be postgresql-testing

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can modify the value no need to define the variables again :D

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

modify the value inside the hcl file?
I had a look at https://docs.docker.com/build/bake/overrides/ and that's how they override a variable inside an override file

variable "TAG" {
  default = "bar"
}

I also have tried to set it like we did for platforms in the troubleshooting session

  platforms = [
    "linux/amd64",
  ]
  environment = [
    "production",
  ]
  registry = [
    "xxx/cnpg",
  ]

but that's not working eighter.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


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