3.6 KiB
docker-compose-m4
preprocess docker-compose.yml with m4
This is a simple script that preprocesses your docker-compose.yml file with the m4 preprocessor.
Installation
# make install
Usage
Let's say we have a docker-compose.yml file like following. We would like to store it in a git repository, but we don't want to show people the postgres password.
One option would be to use secrets, but that won't work if one of the containers doesn't support reading the password from a file. We would need a preprocessor for that.
docker-compose.yml
version: '3'
services:
db:
image: postgres:15
volumes:
- ./data/postgres:/var/lib/postgresql/data
restart: unless-stopped
environment:
- POSTGRES_USER=joplin
- POSTGRES_DB=joplin
- POSTGRES_PASSWORD=passwordpasswordpasswordpasswordpasswordpasswordpasswordpassword
app:
image: joplin/server:latest
depends_on:
- db
ports:
- "127.0.0.1:22300:22300"
restart: unless-stopped
environment:
- APP_PORT=22300
- APP_BASE_URL=https://joplin.example.com/
- DB_CLIENT=pg
- POSTGRES_CONNECTION_STRING=postgresql://joplin:passwordpasswordpasswordpasswordpasswordpasswordpasswordpassword@db/joplin?sslmode=disable
- Let's rename
docker-compose.yml
todocker-compose.yml.m4
mv docker-compose.yml docker-compose.yml.m4
- Move the password to a separate text file next to
docker-compose.yml.m4
and modifydocker-compose.yml.m4
to read the password from that file.
pgpass.txt
passwordpasswordpasswordpasswordpasswordpasswordpasswordpassword
We can use the iinclude()
function from docker-compose-m4 to include a file and strip newlines.
docker-compose.yml.m4
version: '3'
services:
db:
image: postgres:15
volumes:
- ./data/postgres:/var/lib/postgresql/data
restart: unless-stopped
environment:
- POSTGRES_USER=joplin
- POSTGRES_DB=joplin
- - POSTGRES_PASSWORD=passwordpasswordpasswordpasswordpasswordpasswordpasswordpassword
+ - POSTGRES_PASSWORD=iinclude(pgpass.txt)
app:
image: joplin/server:latest
depends_on:
- db
ports:
- "127.0.0.1:22300:22300"
restart: unless-stopped
environment:
- APP_PORT=22300
- APP_BASE_URL=https://joplin.example.com/
- DB_CLIENT=pg
- - POSTGRES_CONNECTION_STRING=postgresql://joplin:passwordpasswordpasswordpasswordpasswordpasswordpasswordpassword@db/joplin?sslmode=disable
+ - POSTGRES_CONNECTION_STRING=postgresql://joplin:iinclude(pgpass.txt)@db/joplin?sslmode=disable
Finally run the preprocessor to generate the docker-compose.yml file.
docker-compose-m4
docker-compose.yml
is now created and ready to be used.
docker-compose.yml
# DO NOT EDIT THIS FILE
# it has been autogenerated from docker-compose.yml.m4, edit that file instead and then run docker-compose-m4
version: '3'
services:
db:
image: postgres:15
volumes:
- ./data/postgres:/var/lib/postgresql/data
restart: unless-stopped
environment:
- POSTGRES_USER=joplin
- POSTGRES_DB=joplin
- POSTGRES_PASSWORD=passwordpasswordpasswordpasswordpasswordpasswordpasswordpassword
app:
image: joplin/server:latest
depends_on:
- db
ports:
- "127.0.0.1:22300:22300"
restart: unless-stopped
environment:
- APP_PORT=22300
- APP_BASE_URL=https://joplin.example.com/
- DB_CLIENT=pg
- POSTGRES_CONNECTION_STRING=postgresql://joplin:passwordpasswordpasswordpasswordpasswordpasswordpasswordpassword@db/joplin?sslmode=disable