Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enable containerized build of Ibeji integrated with Chariott and Agemo #103

Merged
merged 4 commits into from
Mar 6, 2024
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,3 @@ target/
devops/
docs/
tools/

Cargo.lock
112 changes: 112 additions & 0 deletions Dockerfile_integrated.amd64
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT license.
# SPDX-License-Identifier: MIT

# 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/engine/reference/builder/

# This Dockerfile builds an "integrated" version of Ibeji. Specifically, it builds
# Ibeji with the managed_subscribe feature to integrate with Eclipse Agemo and
# the "integrated" configuration to work with Eclipse Chariott Service Discovery
# and Agemo managed subscribe.

################################################################################
# Create a stage for building the application.

ARG RUST_VERSION=1.72.1
ARG APP_NAME=invehicle-digital-twin
ARG FEATURES=managed_subscribe
ARG UID=10001

FROM docker.io/library/rust:${RUST_VERSION}-slim-bullseye AS build
ARG APP_NAME
ARG FEATURES
WORKDIR /sdv

COPY ./ .

# Check that APP_NAME argument is valid.
RUN /sdv/container/scripts/argument_sanitizer.sh \
--arg-value "${APP_NAME}" \
--regex "^[a-zA-Z_0-9-]+$" || \
( echo "Argument sanitizer failed for ARG 'APP_NAME'"; exit 1 )

# Check that FEATURES argument is valid if the argument is not empty.
# The regex checks if there is one or more features separated by a single space.
RUN if [ -n "${FEATURES}" ]; then \
/sdv/container/scripts/argument_sanitizer.sh \
--arg-value "${FEATURES}" \
--regex "^[a-zA-Z_0-9-]+(?: [a-zA-Z_0-9-]+)*$" || \
( echo "Argument sanitizer failed for ARG 'FEATURES'"; exit 1 ) \
fi

# Add Build dependencies.
RUN apt update && apt upgrade -y && apt install -y protobuf-compiler

# Build the application (with features if provided).
RUN cargo build --release -p "${APP_NAME}" --features "${FEATURES}"

# Copy the built application to working directory.
RUN cp ./target/release/"${APP_NAME}" /sdv/service

################################################################################
# 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 debian bullseye image as the foundation for running the app.
# By specifying the "bullseye-slim" tag, it will also use whatever happens to be the
# most recent version of that tag when you build your Dockerfile. If
# reproducability is important, consider using a digest
ladatz marked this conversation as resolved.
Show resolved Hide resolved
# (e.g., debian@sha256:ac707220fbd7b67fc19b112cee8170b41a9e97f703f588b2cdbbcdcecdd8af57).
FROM docker.io/library/debian:bullseye-slim AS final
ARG UID

# Copy container scripts.
COPY ./container/scripts/*.sh /sdv/scripts/

# Check that UID argument is valid.
RUN /sdv/scripts/argument_sanitizer.sh \
--arg-value "${UID}" \
--regex "^[0-9]+$" || \
( echo "Argument sanitizer failed for ARG 'UID'"; exit 1 )

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

# Create and add user ownership to config directory.
RUN mkdir -p /sdv/config
RUN chown appuser /sdv/config

# Create mnt directory to copy override configs into.
RUN mkdir -p /mnt/config

USER appuser

WORKDIR /sdv

# Set home environment variable.
ENV IBEJI_HOME=/sdv/config

# Copy the executable from the "build" stage.
COPY --from=build /sdv/service /sdv/

# Copy configuration for service.
COPY --from=build /sdv/container/config/integrated/ /sdv/config

# Expose the port that the in-vehicle digital twin service listens on.
EXPOSE 5010

# What the container should run when it is started.
CMD ["/sdv/scripts/container_startup.sh"]
116 changes: 116 additions & 0 deletions Dockerfile_integrated.arm64
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT license.
# SPDX-License-Identifier: MIT

# 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/engine/reference/builder/

# This Dockerfile builds an "integrated" version of Ibeji. Specifically, it builds
# Ibeji with the managed_subscribe feature to integrate with Eclipse Agemo and
# the "integrated" configuration to work with Eclipse Chariott Service Discovery
# and Agemo managed subscribe.

################################################################################
# Create a stage for building the application.

ARG RUST_VERSION=1.72.1
ARG APP_NAME=invehicle-digital-twin
ARG FEATURES=managed_subscribe
ARG UID=10001

FROM docker.io/library/rust:${RUST_VERSION}-slim-bullseye AS build
ARG APP_NAME
ARG FEATURES
WORKDIR /sdv

COPY ./ .

# Check that APP_NAME argument is valid.
RUN /sdv/container/scripts/argument_sanitizer.sh \
--arg-value "${APP_NAME}" \
--regex "^[a-zA-Z_0-9-]+$" || \
( echo "Argument sanitizer failed for ARG 'APP_NAME'"; exit 1 )

# Check that FEATURES argument is valid if the argument is not empty.
# The regex checks if there is one or more features separated by a single space.
RUN if [ -n "${FEATURES}" ]; then \
/sdv/container/scripts/argument_sanitizer.sh \
--arg-value "${FEATURES}" \
--regex "^[a-zA-Z_0-9-]+(?: [a-zA-Z_0-9-]+)*$" || \
( echo "Argument sanitizer failed for ARG 'FEATURES'"; exit 1 ) \
fi

# Add Build dependencies.
RUN apt update && apt upgrade -y && apt install -y \
protobuf-compiler \
gcc-aarch64-linux-gnu

RUN rustup target add aarch64-unknown-linux-gnu

# Build the application (with features if provided).
RUN cargo build --release --target=aarch64-unknown-linux-gnu -p "${APP_NAME}" --features "${FEATURES}"

# Copy the built application to working directory.
RUN cp ./target/aarch64-unknown-linux-gnu/release/"${APP_NAME}" /sdv/service

################################################################################
# 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 debian bullseye image as the foundation for running the app.
# By specifying the "bullseye-slim" tag, it will also use whatever happens to be the
# most recent version of that tag when you build your Dockerfile. If
# reproducability is important, consider using a digest
# (e.g., debian@sha256:ac707220fbd7b67fc19b112cee8170b41a9e97f703f588b2cdbbcdcecdd8af57).
FROM docker.io/arm64v8/debian:bullseye-slim AS final
ARG UID

# Copy container scripts.
COPY ./container/scripts/*.sh /sdv/scripts/

# Check that UID argument is valid.
RUN /sdv/scripts/argument_sanitizer.sh \
--arg-value "${UID}" \
--regex "^[0-9]+$" || \
( echo "Argument sanitizer failed for ARG 'UID'"; exit 1 )

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

# Create and add user ownership to config directory.
RUN mkdir -p /sdv/config
RUN chown appuser /sdv/config

# Create mnt directory to copy override configs into.
RUN mkdir -p /mnt/config

USER appuser

WORKDIR /sdv

# Set home environment variable.
ENV IBEJI_HOME=/sdv/config

# Copy the executable from the "build" stage.
COPY --from=build /sdv/service /sdv/

# Copy configuration for service.
COPY --from=build /sdv/container/config/integrated/ /sdv/config

# Expose the port that the in-vehicle digital twin service listens on.
EXPOSE 5010

# What the container should run when it is started.
CMD ["/sdv/scripts/container_startup.sh"]