Skip to content
Snippets Groups Projects
Commit a12afdb5 authored by Gilles Filippini's avatar Gilles Filippini
Browse files

docker: backport changes from dev branch

parent 28208221
No related branches found
No related tags found
No related merge requests found
......@@ -17,17 +17,16 @@ RUN apk update && \
WORKDIR /duniter
# copy source tree
COPY ./ ./
# install latest stable rust
RUN curl https://sh.rustup.rs -sSf | sh -s -- -y
# copy source tree
COPY ./ ./
# build duniter
RUN PATH=${HOME}/.cargo/bin:${PATH} \
RUSTFLAGS="-C target-feature=-crt-static" \
make -C release ADD_DEBUG=N server-gui clean \
&& cp release/docker/duniter.sh work/docker.sh \
&& rm -rf work/extra
# ------------------------------------------------------------------------------
......@@ -36,18 +35,22 @@ RUN PATH=${HOME}/.cargo/bin:${PATH} \
FROM node:10-alpine
# install jq
RUN apk add jq
# create group and user duniter
RUN addgroup -S -g 1111 duniter && \
adduser -SD -h /duniter -G duniter -u 1111 duniter
RUN mkdir -p /var/lib/duniter /etc/duniter && chown duniter:duniter /var/lib/duniter /etc/duniter
# copy the build artifact from the build stage
COPY --from=build --chown=duniter:duniter /duniter/work /duniter/duniter
COPY --from=build --chown=duniter:duniter /duniter/work /duniter
# copy bootstrap script
RUN cp /duniter/duniter/docker.sh /usr/bin/duniter && \
chmod +x /usr/bin/duniter && \
chown duniter:duniter /usr/bin/duniter
# copy wrappers
COPY release/docker/duniter.sh /usr/bin/duniter
# copy entrypoint
COPY release/docker/docker-entrypoint.sh /
# create volumes
VOLUME /var/lib/duniter
......@@ -58,7 +61,7 @@ EXPOSE 9220 10901 20901
# use duniter user
USER duniter
WORKDIR /duniter
WORKDIR /var/lib/duniter
ENTRYPOINT ["/usr/bin/duniter"]
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD []
#!/bin/sh
set -uo pipefail
boolean () {
echo "$1" | sed -E 's/^(true|yes|1)$/true/i'
}
big_fat_warning='\033[01;31m**WARNING**:\033[0m'
DEBUG_ENTRYPOINT="$(boolean "${DEBUG_ENTRYPOINT:-false}")"
if [ "$DEBUG_ENTRYPOINT" = true ]; then
set -x
fi
# Initialize vars
home=/var/lib/duniter
profile_default=$home/duniter_default
manual_config="$(boolean "${DUNITER_MANUAL_CONFIG:-false}")"
auto_sync="$(boolean "${DUNITER_AUTO_SYNC:-false}")"
DUNITER_PEER_HOST="${DUNITER_PEER_HOST:-${DUNITER_SYNC_HOST:-}}"
if ! echo "${NODE_OPTIONS:-}" | grep '\--max-old-space-size'; then
NODE_OPTIONS="${NODE_OPTIONS:+$NODE_OPTIONS }--max-old-space-size=${DUNITER_MAX_OLD_SPACE_SIZE:-6144}"
export NODE_OPTIONS
fi
# Create default profile path
mkdir -p "$home/duniter_default"
# Manual config when enabled
if [ "$manual_config" = true ]; then
# Do not start until a configuration file was initialized
while ! [ -f "$profile_default/conf.json.orig" ]; do
echo "Waiting for initial configuration file... Please copy your configuration file to '$profile_default/conf.json.orig'"
sleep 10
done
echo "Configuration file found. Continuing..."
# Use new conf.json.orig when changed
md5_file="$profile_default/conf.json.orig.md5"
if ! md5sum -c "$md5_file"; then
if [ -f "$profile_default/conf.json" ]; then
echo "Backing up old configuration file to '$profile_default/conf.json.old'..."
mv $profile_default/conf.json $profile_default/conf.json.old
fi
echo "Installing new configuration file..."
cp "$profile_default/conf.json.orig" "$profile_default/conf.json"
md5sum "$profile_default/conf.json.orig" >"$md5_file"
fi
# Log differences between initial, old and current conf file
jq --sort-keys -r . "$profile_default/conf.json.orig" >"$profile_default/conf.json.orig.sorted"
jq --sort-keys -r . "$profile_default/conf.json" >"$profile_default/conf.json.sorted"
if [ -f "$profile_default/conf.json.old" ]; then
jq --sort-keys -r . "$profile_default/conf.json.old" >"$profile_default/conf.json.old.sorted"
if ! diff -q "$profile_default/conf.json.old.sorted" "$profile_default/conf.json.orig.sorted"; then
diff -u "$profile_default/conf.json.old.sorted" "$profile_default/conf.json.orig.sorted"
fi
fi
if ! diff -q "$profile_default/conf.json.orig.sorted" "$profile_default/conf.json.sorted"; then
diff -u "$profile_default/conf.json.orig.sorted" "$profile_default/conf.json.sorted"
fi
fi
# If conf.json doesn't exist and we have DUNITER_PEER_HOST, then initialise it with
# the currency parameters
host_regex='[a-zA-Z0-9](([a-zA-Z0-9]|-)*[a-zA-Z0-9]+)?(\.[a-zA-Z0-9](([a-zA-Z0-9]|-)*[a-zA-Z0-9]+)?)*'
ipv6_regex='((([0–9A-Fa-f]{1,4}:){7}[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){6}:[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){5}:([0–9A-Fa-f]{1,4}:)?[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){4}:([0–9A-Fa-f]{1,4}:){0,2}[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){3}:([0–9A-Fa-f]{1,4}:){0,3}[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){2}:([0–9A-Fa-f]{1,4}:){0,4}[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){6}((b((25[0–5])|(1d{2})|(2[0–4]d)|(d{1,2}))b).){3}(b((25[0–5])|(1d{2})|(2[0–4]d)|(d{1,2}))b))|(([0–9A-Fa-f]{1,4}:){0,5}:((b((25[0–5])|(1d{2})|(2[0–4]d)|(d{1,2}))b).){3}(b((25[0–5])|(1d{2})|(2[0–4]d)|(d{1,2}))b))|(::([0–9A-Fa-f]{1,4}:){0,5}((b((25[0–5])|(1d{2})|(2[0–4]d)|(d{1,2}))b).){3}(b((25[0–5])|(1d{2})|(2[0–4]d)|(d{1,2}))b))|([0–9A-Fa-f]{1,4}::([0–9A-Fa-f]{1,4}:){0,5}[0–9A-Fa-f]{1,4})|(::([0–9A-Fa-f]{1,4}:){0,6}[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){1,7}:))'
if ! [ -f "$profile_default/conf.json" ] && echo "${DUNITER_PEER_HOST}" | grep -E "^($host_regex|$ipv6_regex)(:[0-9]+)?$"; then
echo "No config file - Initializing currency from '$DUNITER_PEER_HOST'..."
port="${DUNITER_PEER_HOST#*:}"
if [ "${port:-443}" = 443 ]; then
scheme=https://
else
scheme=http://
fi
if wget -q -O- "$scheme$DUNITER_PEER_HOST/blockchain/parameters" >"$profile_default/conf.json.new"; then
mv "$profile_default/conf.json.new" "$profile_default/conf.json"
else
echo -e "$big_fat_warning Failed."
fi
# If peers.db is missing and DUNITER_PEER_HOST is set, bootstrap it using
# 'sync --only-peers'
# Working into a temporary Duniter home to avoid side effects on the current
# database
if ! [ -f "$profile_default/peers.db" ] && [ -n "${DUNITER_PEER_HOST:-}" ]; then
echo "No peers database - Initializing from '$DUNITER_PEER_HOST'..."
rm -fr /tmp/duniter-bootstrap
(
if /usr/bin/duniter --home /tmp/duniter-bootstrap sync "$DUNITER_PEER_HOST" --nointeractive --onlypeers; then
mv /tmp/duniter-bootstrap/duniter_default/peers.db "$profile_default/"
else
echo -e "$big_fat_warning Failed."
fi
)
rm -fr /tmp/duniter-bootstrap
fi
fi
# Auto start synchronization when enabled and starting from scratch
if [ "$auto_sync" = true ]; then
if ! [ -d "$profile_default/data" ]; then
echo "No 'data' folder. "
if [ -z "$DUNITER_SYNC_HOST:-" ]; then
echo "DUNITER_SYNC_HOST undefined. Can't start synchronization!"
else
echo "Starting synchronization..."
/usr/bin/duniter sync "$DUNITER_SYNC_HOST" --nointeractive
fi
fi
fi
# Without parameters, start with web interface
if [ $# = 0 ]; then
set -- direct_webstart
fi
# Network interface to listen to
set -- --webmhost 0.0.0.0 "$@"
# Key file found
if [ -f /etc/duniter/keyring.yml ]; then
set -- --keyfile /etc/duniter/keys.yml "$@"
fi
# Terminate gracefully on SIGTERM by propagating it to the 'node' process
sigterm () {
echo "Received SIGTERM. Terminating..." >&2
pkill node
wait %1
}
trap 'sigterm' TERM
# Start duniter
# Launch in background and wait
# This way we can catch SIGTERM
echo Starting duniter with:
echo /usr/bin/duniter "$@"
/usr/bin/duniter "$@" &
wait %1
#!/bin/sh
# Without parameters, start with web interface
if [[ -z ${1} ]]; then
set -- direct_webstart
# Main
cd /duniter
if [ "$1" != --home ]; then
set -- --home /var/lib/duniter "$@"
fi
# Options
DUNITER_OPTS=
DUNITER_OPTS="${DUNITER_OPTS} --webmhost 0.0.0.0"
DUNITER_OPTS="${DUNITER_OPTS} --home /var/lib/duniter"
DUNITER_OPTS="${DUNITER_OPTS} --mdb duniter_default"
# Key file found
if [[ -f /etc/duniter/key.yml ]]; then
DUNITER_OPTS="${DUNITER_OPTS} --keyfile /etc/duniter/keys.yml"
fi
# Start duniter
cd /duniter/duniter/
bin/duniter ${DUNITER_OPTS} "$@"
exec bin/duniter "$@"
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment