Dockerfile 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. # syntax=docker/dockerfile:1.4
  2. FROM alpine:3.19 AS alpine
  3. ARG TARGETPLATFORM
  4. RUN \
  5. --mount=type=cache,id=$TARGETPLATFORM-alpine,target=/var/cache/apk,sharing=locked \
  6. set -eux; \
  7. apk add -U libgcc;
  8. ################################################################################
  9. FROM alpine AS alpine-dev
  10. ARG TARGETPLATFORM
  11. RUN \
  12. --mount=type=cache,id=$TARGETPLATFORM-alpine,target=/var/cache/apk,sharing=locked \
  13. set -eux; \
  14. apk add -U musl-dev;
  15. ################################################################################
  16. FROM --platform=$BUILDPLATFORM rust:1 AS builder
  17. ARG BUILDPLATFORM
  18. ARG TARGETPLATFORM
  19. RUN \
  20. --mount=type=cache,id=$BUILDPLATFORM-debian,target=/var/cache,sharing=locked \
  21. --mount=type=cache,id=$BUILDPLATFORM-debian,target=/var/lib/apt,sharing=locked \
  22. set -eux; \
  23. case "${TARGETPLATFORM}" in \
  24. linux/i386) \
  25. dpkgArch='i386'; \
  26. ;; \
  27. linux/amd64) \
  28. dpkgArch='amd64'; \
  29. ;; \
  30. linux/arm64) \
  31. dpkgArch='arm64'; \
  32. ;; \
  33. *) echo "unsupported architecture"; exit 1 ;; \
  34. esac; \
  35. dpkg --add-architecture $dpkgArch; \
  36. apt-get update; \
  37. apt-get install -y --no-install-recommends \
  38. musl-dev:$dpkgArch \
  39. musl-tools:$dpkgArch \
  40. ;
  41. WORKDIR /opt/aode-relay
  42. RUN set -eux; \
  43. case "${TARGETPLATFORM}" in \
  44. linux/i386) arch='i686';; \
  45. linux/amd64) arch='x86_64';; \
  46. linux/arm64) arch='aarch64';; \
  47. *) echo "unsupported architecture"; exit 1 ;; \
  48. esac; \
  49. rustup target add "${arch}-unknown-linux-musl";
  50. ADD Cargo.lock Cargo.toml /opt/aode-relay/
  51. RUN cargo fetch;
  52. ADD . /opt/aode-relay
  53. COPY --link --from=alpine-dev / /opt/alpine/
  54. RUN set -eux; \
  55. case "${TARGETPLATFORM}" in \
  56. linux/i386) arch='i686';; \
  57. linux/amd64) arch='x86_64';; \
  58. linux/arm64) arch='aarch64';; \
  59. *) echo "unsupported architecture"; exit 1 ;; \
  60. esac; \
  61. ln -s "target/${arch}-unknown-linux-musl/release/relay" "aode-relay"; \
  62. export RUSTFLAGS="-C target-cpu=generic -C linker=${arch}-linux-musl-gcc -C target-feature=-crt-static -C link-self-contained=no -L /opt/alpine/lib -L /opt/alpine/usr/lib"; \
  63. cargo build --frozen --release --target="${arch}-unknown-linux-musl";
  64. ################################################################################
  65. FROM alpine
  66. ARG TARGETPLATFORM
  67. RUN \
  68. --mount=type=cache,id=$TARGETPLATFORM-alpine,target=/var/cache/apk,sharing=locked \
  69. set -eux; \
  70. apk add -U ca-certificates curl tini;
  71. COPY --link --from=builder /opt/aode-relay/aode-relay /usr/local/bin/aode-relay
  72. # Smoke test
  73. RUN /usr/local/bin/aode-relay --help
  74. # Some base env configuration
  75. ENV ADDR 0.0.0.0
  76. ENV PORT 8080
  77. ENV DEBUG false
  78. ENV VALIDATE_SIGNATURES true
  79. ENV HTTPS false
  80. ENV PRETTY_LOG false
  81. ENV PUBLISH_BLOCKS true
  82. ENV SLED_PATH "/var/lib/aode-relay/sled/db-0.34"
  83. ENV RUST_LOG warn
  84. VOLUME "/var/lib/aode-relay"
  85. ENTRYPOINT ["/sbin/tini", "--"]
  86. CMD ["/usr/local/bin/aode-relay"]
  87. EXPOSE 8080
  88. HEALTHCHECK CMD curl -sSf "localhost:$PORT/healthz" > /dev/null || exit 1