-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile
More file actions
148 lines (121 loc) · 4.33 KB
/
Copy pathDockerfile
File metadata and controls
148 lines (121 loc) · 4.33 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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#define global variable where exec will be located at
ARG ROOT_FOLDER_DEPLOYER=/app/bin
#builder
FROM golang:1.18-alpine AS build
#initialisation from global variable
ARG ROOT_FOLDER_DEPLOYER
#install container dependencies
#gcc & musl-dev are required for go-ethereum library
RUN apk add --no-cache make git gcc musl-dev
#define working directory
WORKDIR /app
#do not link program to c librairies
ENV CGO_ENABLED=0
#copy source code excluding what's in .dockerignore
COPY . ./
#get app dependencies
RUN make dep
#build the app
RUN make build
#get the BINARY name generated by make build
#replace the placeholder in the entrypoint file with the BINARY name
# / -> | as directory path contains escapable char
RUN export BINARY=$(make print-BINARY | cut -d "=" -f 2 | xargs); sed -i -r "s|BINARY|${ROOT_FOLDER_DEPLOYER}/${BINARY}|g" ./entrypoint.sh
#set permission here as might not be possible within the deployer
RUN chmod +x ./entrypoint.sh
#deployer
FROM golang:1.18-alpine
#initialisation from global variable
ARG ROOT_FOLDER_DEPLOYER
#define cli args
ARG transactions_file_path
ARG genesis_file_path
ARG keystore_dir_path
ARG nodes_file_path
ARG users_file_path
ARG cmd
#define the app args
ARG SBQ_ENV
ARG SBQ_SERVER_ADDRESS
ARG SBQ_SERVER_PORT
ARG SBQ_SERVER_IS_SSL
ARG SBQ_SERVER_CERT_FILE
ARG SBQ_SERVER_KEY_FILE
ARG SBQ_SERVER_HTTP_CORS_ALLOWED_ORIGINS
ARG SBQ_SERVER_HTTP_CORS_ALLOWED_METHODS
ARG SBQ_SERVER_HTTP_CORS_ALLOWED_HEADERS
ARG SBQ_IS_AUTHENTICATION_ACTIVATED
ARG SBQ_IS_JKMS_ACTIVATED
ARG SBQ_DOMAINS_TO_START
ARG SBQ_JWT_KEY_PATH
ARG SBQ_JWT_KEY_ID
ARG SBQ_JWT_EXPIRES_IN_HOURS
ARG SBQ_JWT_DOMAIN
ARG SBQ_JWT_AUDIENCE
ARG SBQ_JWT_ISSUER
ARG SBQ_JWT_ALGO
ARG SBQ_JWT_JKMS_URL
ARG SBQ_JWT_JKMS_REFRESH_CACHE_INTERVAL_IN_MIN
ARG SBQ_JWT_JKMS_REFRESH_CACHE_RATE_LIMIT_IN_MIN
ARG SBQ_JWT_JKMS_REFRESH_CACHE_TIMEOUT_IN_SEC
#define user running the container
ARG USERNAME=blockchain-app
ARG USER_UID=1000
ARG USER_GID=$USER_UID
WORKDIR /
#copy binaries
COPY --from=build /app/bin/ ${ROOT_FOLDER_DEPLOYER}/
#copy entrepoint script knowing the binary to start
COPY --from=build /app/entrypoint.sh ${ROOT_FOLDER_DEPLOYER}/entrypoint.sh
#shadow needed to add new user
RUN apk add --no-cache shadow
#add user to system
RUN groupadd --gid $USER_GID $USERNAME \
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME
#set default user
USER $USERNAME
#expose node port
EXPOSE 8080
#define app env
#global
ENV ROOT_FOLDER_DEPLOYER=${ROOT_FOLDER_DEPLOYER}
#cli
ENV transactions_file_path=${transactions_file_path}
ENV genesis_file_path=${genesis_file_path}
ENV keystore_dir_path=${keystore_dir_path}
ENV nodes_file_path=${nodes_file_path}
ENV users_file_path=${users_file_path}
ENV cmd=${cmd}
#node
ENV SBQ_SERVER_ADDRESS=${SBQ_SERVER_ADDRESS}
ENV SBQ_SERVER_PORT=${SBQ_SERVER_PORT}
ENV SBQ_SERVER_IS_SSL=${SBQ_SERVER_IS_SSL}
ENV SBQ_SERVER_CERT_FILE=${SBQ_SERVER_CERT_FILE}
ENV SBQ_SERVER_KEY_FILE=${SBQ_SERVER_KEY_FILE}
ENV SBQ_SERVER_HTTP_CORS_ALLOWED_ORIGINS=${SBQ_SERVER_HTTP_CORS_ALLOWED_ORIGINS}
ENV SBQ_SERVER_HTTP_CORS_ALLOWED_METHODS=${SBQ_SERVER_HTTP_CORS_ALLOWED_METHODS}
ENV SBQ_SERVER_HTTP_CORS_ALLOWED_HEADERS=${SBQ_SERVER_HTTP_CORS_ALLOWED_HEADERS}
ENV SBQ_IS_AUTHENTICATION_ACTIVATED=${SBQ_IS_AUTHENTICATION_ACTIVATED}
ENV SBQ_IS_JKMS_ACTIVATED=${SBQ_IS_JKMS_ACTIVATED}
ENV SBQ_DOMAINS_TO_START=${SBQ_DOMAINS_TO_START}
ENV SBQ_JWT_KEY_PATH=${SBQ_JWT_KEY_PATH}
ENV SBQ_JWT_KEY_ID=${SBQ_JWT_KEY_ID}
ENV SBQ_JWT_EXPIRES_IN_HOURS=${SBQ_JWT_EXPIRES_IN_HOURS}
ENV SBQ_JWT_DOMAIN=${SBQ_JWT_DOMAIN}
ENV SBQ_JWT_AUDIENCE=${SBQ_JWT_AUDIENCE}
ENV SBQ_JWT_ISSUER=${SBQ_JWT_ISSUER}
ENV SBQ_JWT_ALGO=${SBQ_JWT_ALGO}
ENV SBQ_JWT_JKMS_URL=${SBQ_JWT_JKMS_URL}
ENV SBQ_JWT_JKMS_REFRESH_CACHE_INTERVAL_IN_MIN=${SBQ_JWT_JKMS_REFRESH_CACHE_INTERVAL_IN_MIN}
ENV SBQ_JWT_JKMS_REFRESH_CACHE_RATE_LIMIT_IN_MIN=${SBQ_JWT_JKMS_REFRESH_CACHE_RATE_LIMIT_IN_MIN}
ENV SBQ_JWT_JKMS_REFRESH_CACHE_TIMEOUT_IN_SEC=${SBQ_JWT_JKMS_REFRESH_CACHE_TIMEOUT_IN_SEC}
#add volume for the files to be bound
VOLUME ["databases"]
#we cannot use the exec form, so the CMD instruction is off the table
#let's pass our own CMD
ENTRYPOINT cd "$ROOT_FOLDER_DEPLOYER" && ./entrypoint.sh --transactions_file_path "$transactions_file_path" \
--genesis_file_path "$genesis_file_path" \
--keystore_dir_path "$keystore_dir_path" \
--nodes_file_path "$nodes_file_path" \
--users_file_path "$users_file_path" \
${cmd}