Skip to content

Commit

Permalink
update cdn service docker file
Browse files Browse the repository at this point in the history
  • Loading branch information
code-ga committed Dec 16, 2023
1 parent 66fbec9 commit f6cfac3
Show file tree
Hide file tree
Showing 3 changed files with 134 additions and 21 deletions.
33 changes: 31 additions & 2 deletions server/cdn-service/.dockerignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,32 @@
/target
# Include any files or directories that you don't want to be copied to your
# container here (e.g., local build artifacts, temporary files, etc.).
#
# For more help, visit the .dockerignore file reference guide at
# https://docs.docker.com/go/build-context-dockerignore/

.env
**/.DS_Store
**/.classpath
**/.dockerignore
**/.env
**/.git
**/.gitignore
**/.project
**/.settings
**/.toolstarget
**/.vs
**/.vscode
**/*.*proj.user
**/*.dbmdl
**/*.jfm
**/charts
**/docker-compose*
**/compose*
**/Dockerfile*
**/node_modules
**/npm-debug.log
**/secrets.dev.yaml
**/values.dev.yaml
/bin
/target
LICENSE
README.md
100 changes: 81 additions & 19 deletions server/cdn-service/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,27 +1,89 @@
FROM rust:slim as rust-build
WORKDIR /home/app
# syntax=docker/dockerfile:1

RUN apt-get update && apt-get install -y git curl && \
apt-get install -y pkg-config libssl-dev gcc ca-certificates libc6-dev libgcc1 musl-tools && \
apt-get clean
# Comments are provided throughout this file to help you get started.
# If you need more help, visit the Dockerfile reference guide at
# https://docs.docker.com/go/dockerfile-reference/

ARG RUST_VERSION=1.74.0
ARG APP_NAME=upload_service

COPY Cargo.toml Cargo.lock ./
RUN mkdir src && echo 'fn main() {}' > src/main.rs
################################################################################
# xx is a helper for cross-compilation.
# See https://github.com/tonistiigi/xx/ for more information.
FROM --platform=$BUILDPLATFORM tonistiigi/xx:1.3.0 AS xx

RUN --mount=type=cache,target=/usr/local/cargo/registry cargo build --release
################################################################################
# Create a stage for building the application.
FROM --platform=$BUILDPLATFORM rust:${RUST_VERSION}-alpine AS build
ARG APP_NAME
WORKDIR /app

RUN rm -rf src
# Copy cross compilation utilities from the xx stage.
COPY --from=xx / /

COPY ./src ./src
# RUN rm -rf ./target/release/..fingerprint/upload_service*
RUN rm -rf ./target/release/deps/upload_service*
RUN --mount=type=cache,target=/usr/local/cargo/registry cargo build --release
# Install host build dependencies.
RUN apk add --no-cache clang lld musl-dev git file

FROM debian:stable-slim
WORKDIR /home/app
RUN apt-get update && apt-get install -y libssl-dev && apt-get clean
# This is the architecture you’re building for, which is passed in by the builder.
# Placing it here allows the previous steps to be cached across architectures.
ARG TARGETPLATFORM

COPY --from=rust-build /home/app/target/release/upload_service .
ENV RUST_BACKTRACE=1
CMD ["./upload_service"]
# Install cross compilation build dependencies.
RUN xx-apk add --no-cache musl-dev gcc
RUN xx-apk add pkgconfig openssl-dev openssl
ENV OPENSSL_DIR=/usr

# Build the application.
# Leverage a cache mount to /usr/local/cargo/registry/
# for downloaded dependencies, a cache mount to /usr/local/cargo/git/db
# for git repository dependencies, and a cache mount to /app/target/ for
# compiled dependencies which will speed up subsequent builds.
# Leverage a bind mount to the src directory to avoid having to copy the
# source code into the container. Once built, copy the executable to an
# output directory before the cache mounted /app/target is unmounted.
RUN --mount=type=bind,source=src,target=src \
--mount=type=bind,source=Cargo.toml,target=Cargo.toml \
--mount=type=bind,source=Cargo.lock,target=Cargo.lock \
--mount=type=cache,target=/app/target/,id=rust-cache-${APP_NAME}-${TARGETPLATFORM} \
--mount=type=cache,target=/usr/local/cargo/git/db \
--mount=type=cache,target=/usr/local/cargo/registry/ \
<<EOF
set -e
xx-cargo build --locked --release --target-dir ./target
cp ./target/$(xx-cargo --print-target-triple)/release/$APP_NAME /bin/server
xx-verify /bin/server
EOF

################################################################################
# Create a new stage for running the application that contains the minimal
# runtime dependencies for the application. This often uses a different base
# image from the build stage where the necessary files are copied from the build
# stage.
#
# The example below uses the alpine image as the foundation for running the app.
# By specifying the "3.18" tag, it will use version 3.18 of alpine. If
# reproducability is important, consider using a digest
# (e.g., alpine@sha256:664888ac9cfd28068e062c991ebcff4b4c7307dc8dd4df9e728bedde5c449d91).
FROM alpine:3.18 AS final

# Create a non-privileged user that the app will run under.
# See https://docs.docker.com/go/dockerfile-user-best-practices/
ARG UID=10001
RUN adduser \
--disabled-password \
--gecos "" \
--home "/nonexistent" \
--shell "/sbin/nologin" \
--no-create-home \
--uid "${UID}" \
appuser
USER appuser

# Copy the executable from the "build" stage.
COPY --from=build /bin/server /bin/

# Expose the port that the application listens on.
EXPOSE 3000

# What the container should run when it is started.
CMD ["/bin/server"]
22 changes: 22 additions & 0 deletions server/cdn-service/README.Docker.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
### Building and running your application

When you're ready, start your application by running:
`docker compose up --build`.

Your application will be available at http://localhost:3000.

### Deploying your application to the cloud

First, build your image, e.g.: `docker build -t myapp .`.
If your cloud uses a different CPU architecture than your development
machine (e.g., you are on a Mac M1 and your cloud provider is amd64),
you'll want to build the image for that platform, e.g.:
`docker build --platform=linux/amd64 -t myapp .`.

Then, push it to your registry, e.g. `docker push myregistry.com/myapp`.

Consult Docker's [getting started](https://docs.docker.com/go/get-started-sharing/)
docs for more detail on building and pushing.

### References
* [Docker's Rust guide](https://docs.docker.com/language/rust/)

1 comment on commit f6cfac3

@code-ga
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#41

Please sign in to comment.