# Build cloudflare-ddns-update into a container which runs it through a cron job every 15m. # # Build locally: # $ docker build . # # Test locally: # $ docker run \ # -e "CF_DDNS_AUTH_TOKEN=…" \ # -e "CF_DDNS_ZONE_ID=…" \ # -e "CF_DDNS_RECORD_NAME=…" \ # # # Stop by checking container ID in `docker ps -a` and running `docker stop `. # # Tag: # $ docker build -t jakewharton/cloudflare-ddns-update: . # # Release: # $ docker push jakewharton/cloudflare-ddns-update: # # Content dervied in part from: # - https://stackoverflow.com/a/46220104/132047 # - https://stackoverflow.com/a/47960145/132047 # - https://alexbrand.dev/post/how-to-package-rust-applications-into-minimal-docker-containers/ # - https://roboslang.blog/post/2017-12-06-cron-docker/ # Cross-compile the app for musl to create a statically-linked binary. FROM clux/muslrust:1.40.0-stable AS build WORKDIR / RUN USER=root cargo new app WORKDIR /app COPY Cargo.toml Cargo.lock ./ COPY src ./src RUN cargo build --release # Build a container which runs the binary with cron. FROM alpine:3.6 RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/* WORKDIR /app COPY docker/cron_cli.sh docker/cron_cmd.sh ./ COPY docker/crontab /etc/crontabs/root COPY --from=build /app/target/x86_64-unknown-linux-musl/release/cloudflare-ddns-update ./ ENTRYPOINT ["/app/cron_cmd.sh"]