#!/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 < "$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