-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathDockerfile.template
More file actions
120 lines (88 loc) · 3.82 KB
/
Dockerfile.template
File metadata and controls
120 lines (88 loc) · 3.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
################################################################################
# Base image
################################################################################
FROM balenalib/%%BALENA_MACHINE_NAME%%-debian as base
ENV DEBIAN_FRONTEND=noninteractive
# libgatekeeper dependencies
RUN apt-get -q update \
&& apt-get install -yq --no-install-recommends libnfc-dev libfreefare-dev uuid-dev libssl-dev \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# Build libgatekeeper
RUN apt-get -q update \
&& apt-get install -yq --no-install-recommends build-essential cmake pkg-config curl \
&& cd /usr/src \
&& curl -o libgatekeeper.tar.gz -fsSL https://api.github.com/repos/ComputerScienceHouse/libgatekeeper/tarball \
&& tar -zxvf libgatekeeper.tar.gz \
&& mv *-libgatekeeper-* libgatekeeper \
&& mkdir /usr/src/libgatekeeper/build \
&& cd /usr/src/libgatekeeper/build \
&& cmake .. \
&& make \
&& make install \
&& apt-get remove --purge -yq build-essential cmake pkg-config curl \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
################################################################################
# Rust image
################################################################################
FROM base as rust
# Install build tools
RUN apt-get -q update && apt-get install -yq --no-install-recommends build-essential curl file
# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=923479
# https://github.com/balena-io-library/base-images/issues/562
RUN c_rehash
ENV PATH=/root/.cargo/bin:$PATH
# Install Rust
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --default-toolchain 1.41.0 -y
################################################################################
# Dependencies
################################################################################
FROM rust as dependencies
WORKDIR /build/workspace
# Copy workspace config
COPY Cargo.* ./
# Setup fake projects
RUN USER=root cargo new gatekeeper --bin \
&& USER=root cargo new libgatekeeper-sys --lib \
&& mkdir gatekeeper/src/bin \
&& mv gatekeeper/src/main.rs gatekeeper/src/bin/main.rs \
&& touch gatekeeper/src/lib.rs
# Copy project configs
COPY gatekeeper/Cargo.* ./gatekeeper/
COPY libgatekeeper-sys/Cargo.* ./libgatekeeper-sys/
# Build app, then remove the fake app build artifacts
#
# NOTE If your application name contains `-` (`foo-bar` for example)
# then the correct command to remove build artifacts looks like:
#
# RUN rm -rf target/release/foo-bar target/release/deps/foo_bar-*
# ^ ^
RUN cargo build --release \
&& rm -rf target/release/gatekeeper* target/release/deps/gatekeeper-* \
&& rm -rf target/release/libgatekeeper-sys* target/release/deps/libgatekeeper_sys-*
################################################################################
# Builder
################################################################################
FROM rust as builder
# We do not want to download deps, update registry, ... again
COPY --from=dependencies /root/.cargo /root/.cargo
WORKDIR /build/app
# Copy everything, not just source code
COPY . .
# Update already built deps from dependencies image
COPY --from=dependencies /build/workspace/target target
# Build real app
RUN cargo build --release
################################################################################
# Final image
################################################################################
FROM base
WORKDIR /app
ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
# Copy binary from builder image
COPY --from=builder /build/app/target/release/gatekeeper .
# Copy other folders required by the application. Example:
# COPY --from=builder /build/app/assets assets
# Launch application
CMD ["./gatekeeper", "pn532_i2c:/dev/i2c-2"]