-
Notifications
You must be signed in to change notification settings - Fork 31
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 12 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 | ||
smiyc marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| [article]({{% ref "/blog/building-images-bake/" %}}) | ||
| on how to customize docker images using an override hcl file. | ||
smiyc marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| Before the [postgres-containers repo]((https://github.com/cloudnative-pg/postgres-containers)) | ||
| was extended by the option to build the images with `docker build bake`, | ||
smiyc marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| I had to do this steps, for each PostgreSQL version. | ||
smiyc marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| - clone the repo | ||
| - edit the dockerfile | ||
| - build the image | ||
| - push it to the registry | ||
|
|
||
| So a lot of boring work needed to be done in order to have updated images. | ||
| The chance to avoid this work sounds prommising to me, so I started with the | ||
smiyc marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
smiyc marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| [hcl file]((https://raw.githubusercontent.com/cloudnative-pg/cloudnative-pg.github.io/refs/heads/main/content/blog/building-images-bake/bake.hcl)) | ||
|
|
||
| The wrote and adopted it to fit my needs. | ||
smiyc marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| After a troubleshooting session, he asked me to share the changes I made. | ||
FloorD marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| So here we are. | ||
smiyc marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| ## Instructions | ||
|
|
||
| ### Step 1: Prepare local Bake file | ||
smiyc marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| 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 them | ||
smiyc marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| 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/)) | ||
smiyc marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| with the newly built images. | ||
| Test them and stage them through your environment. | ||
|
|
||
| ## Conclusion | ||
|
|
||
| Once you prepared the override file to fit to your needs, the only manual setps | ||
smiyc marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| 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.