This code consists on a few components:
- Python script, which connects to Cloudflare to update a DNS entry
- Dockerfile, to build the image for the Python script. Based on Python official slim image
- docker-compose example file
It should support most architectures, however, I just built it for amd64 and arm64v8.
Here are some example snippets to help you get started creating a container.
docker-compose (recommended, click here for more info)
---
version: '2.1'
services:
cloudflare-ddns:
image: luisnabais/cloudflare-ddns:1.0
container_name: cloudflare-ddns
hostname: cloudflare-ddns
environment:
- [email protected]
- API_KEY=a8dd892bd2a0a69187358b1ce7f7cabc2f85
- HOSTNAME=home.example.com
- ZONE_ID=6ef3e0abc8ad776905a522c2ceb6f7d0
- RECORD_ID=99ebe0933256654a8f0ec19d2a16fa50
- TTL=600
restart: unless-stopped
docker cli (click here for more info)
docker run -d \
--name=cloudflare-ddns \
-e [email protected] \
-e API_KEY=a8dd892bd2a0a69187358b1ce7f7cabc2f85 \
-e HOSTNAME=home.example.com \
-e ZONE_ID=6ef3e0abc8ad776905a522c2ceb6f7d0 \
-e RECORD_ID=99ebe0933256654a8f0ec19d2a16fa50 \
-e TTL=600 \
--restart unless-stopped \
luisnabais/cloudflare-ddns:1.0
The variables are expected to be environment variables, so first they need to be exported. You can use a basic shell script or just execute the commands (mind that executing the commands keeps them in history, if they are not cleaned up after).
export EMAIL="[email protected]"
export API_KEY="a8dd892bd2a0a69187358b1ce7f7cabc2f85"
export HOSTNAME="home.example.com"
export ZONE_ID="6ef3e0abc8ad776905a522c2ceb6f7d0"
export RECORD_ID="99ebe0933256654a8f0ec19d2a16fa50"
export TTL="600"
./update_ddns.py
Parameter | Function |
---|---|
-e [email protected] |
CloudFlare E-mail. |
-e API_KEY=a8dd892bd2a0a69187358b1ce7f7cabc2f85 |
Account global CloudFlare API Key. |
-e HOSTNAME=home.example.com |
The hostname/DNS to update. |
-e ZONE_ID=6ef3e0abc8ad776905a522c2ceb6f7d0 |
The Zone ID where the hostname is. It can be checked on the CloudFlare account. |
-e RECORD_ID=99ebe0933256654a8f0ec19d2a16fa50 |
The Record ID for the entry to update. Run once the script manually without record id as parameter, it will return all records, just get the record ID to insert here. |
-e TTL=600 |
The interval in seconds to update the DNS entry. 600 is 10 minutes. |
Below are the instructions for updating containers:
- Update all images:
docker-compose pull
- or update a single image:
docker-compose pull cloudflare-ddns
- or update a single image:
- Let compose update all containers as necessary:
docker-compose up -d
- or update a single container:
docker-compose up -d cloudflare-ddns
- or update a single container:
-
Update the image:
docker pull luisnabais/cloudflare-ddns:1.0
-
Stop the running container:
docker stop cloudflare-ddns
-
Delete the container:
docker rm cloudflare-ddns
-
Recreate a new container with the same docker run parameters as instructed above.
-
You can also remove the old dangling images:
docker image prune
If you want to make local modifications to these images for development purposes or just to customize the logic:
git clone https://github.com/luisnabais/docker-cloudflare-ddns.git
cd docker-cloudflare-ddns
docker build \
--no-cache \
--pull \
-t luisnabais/cloudflare-ddns:1.0 .
- 11.05.22: - Initial Release.