You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

109 lines
2.7 KiB

#!/bin/bash
## Init is run on host
## For now it is run every time the script is launched, but
## it should be launched only once after build.
## Accessible variables are:
## - SERVICE_NAME Name of current service
## - DOCKER_BASE_IMAGE Base image from which this service might be built if any
## - SERVICE_DATASTORE Location on host of the DATASTORE of this service
## - SERVICE_CONFIGSTORE Location on host of the CONFIGSTORE of this service
. lib/common
set -e
uid=$(docker_get_uid "$SERVICE_NAME" "mongodb")
## Check for old bogus version, and stop and remove container
## if it is running.
containers=($(get_running_containers_for_service "$SERVICE_NAME"))
if [[ "${#containers[@]}" -gt 1 ]]; then
err "More than 1 container running for service $DARKYELLOW$SERVICE_NAME$NORMAL."
echo " Please contact administrator to fix this issue." >&2
return 1
fi
if [[ "${#containers[@]}" == 1 ]]; then
## We need to check that this running container
## has same uid as the new image. If not, we need
## to stop and remove it.
container_id=${containers[0]}
container_uid=$(docker exec "$container_id" id -u mongodb)
if [[ "$container_uid" != "$uid" ]]; then
info "Container $container_id is running with different uid than new image."
info "Stopping container $container_id."
docker stop "$container_id" &&
docker rm "$container_id"
fi
fi
##
## Normal init
##
CONFIG=$SERVICE_CONFIGSTORE/etc/mongod.conf
mkdir -p "$(dirname "$CONFIG")"
## XXXvlab: replication here is hardwired and not handled at all
cat <<EOF > "$CONFIG"
storage:
dbPath: /var/lib/mongodb
net:
bindIp: 0.0.0.0
replication:
oplogSizeMB: 128
replSetName: rs01
EOF
chown -v "$uid" "$CONFIG"
dirs=(/var/{log,lib}/mongodb )
host_dirs=()
for dir in "${dirs[@]}"; do
host_dirs+=("$SERVICE_DATASTORE$dir")
done
mkdir -p "${host_dirs[@]}"
find "${host_dirs[@]}" \! -user "$uid" -print0 | while read-0 f; do
chown -v "$uid" "$f" || exit 1
done
config_hash=$(cat "$CONFIG" | md5_compat) || exit 1
init-config-add "
$MASTER_BASE_SERVICE_NAME:
labels:
- compose.config_hash=$config_hash
"
ensure_db_docker_running
## ReplicaSet initialization
cmd="rs.initiate({ _id: 'rs01', members: [ { _id: 0, host: '$SERVICE_NAME:27017' } ]})"
debug "${WHITE}running:$NORMAL $cmd"
out=$(ddb 2>&1 <<<"$cmd") || true
if [[ "$out" == *"\"codeName\" : \"AlreadyInitialized\""* ]] ||
[[ "$out" == *"MongoServerError: already initialized"* ]]; then
info "ReplicaSet already initialized."
elif [[ "$out" == *"\"ok\" : 1"* ]]; then
info "ReplicaSet initialized. "
else
err "ReplicaSet initialisation failed:"
echo "$out" >&2
exit 13
fi