summaryrefslogtreecommitdiffstats
path: root/core/modules/run-virt-docker/data/opt/openslx/vmchooser/plugins/docker/docker-init
blob: 5f52a16d1705511789764a4785007b5ec132fcde (plain) (blame)
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
#!/bin/bash

USER_CONTAINER_CONFIG=""

echo "+ source user_config $USER_CONTAINER_CONFIG"
source $USER_CONTAINER_CONFIG

load_image () {

	IMAGE_SIZE=$(stat --printf="%s" $VM_DISKFILE_RO)
	# check file size of VM_DISKFILE_RO is equals to 4096 = 4kB (because of padding)
	if [[ $IMAGE_SIZE -eq 4096 ]]; then 
		echo "+ build container image with build_context"
		echo "+ docker build --tag $CONTAINER_IMAGE_NAME $CONTAINER_BUILD_CONTEXT"
		docker build --tag $CONTAINER_IMAGE_NAME $CONTAINER_BUILD_CONTEXT
	else
		# In this case a pre build container image (tar archive from "docker save ...") 
		# will be loaded into the local docker daemon. 
		echo "+ load container image"
		# create TMP_FILE for image
		local TMP_FILE=$(mktemp)
		# write currently existing image ids into TMP_FILE
		cp $VM_DISKFILE_RO $TMP_FILE
		# recieve the RepoTag form the manifest.json inside the tar
		local REPO_TAG=$(tar -axf $TMP_FILE manifest.json -O | jq -r '.[].RepoTags[0]')
		# load image from tar file
		docker load --input $TMP_FILE
		# rename image 
		docker tag "$REPO_TAG" "$CONTAINER_IMAGE_NAME"
		rm -f -- "$TMP_FILE"
	fi
	retval=$?
	return $retval
}

main () 
{
	# TODO only check by image name could be bad, images whith a same name could exist

	# check if the container_image_name already loaded in docker daemon
	if [[ -z $(docker images $CONTAINER_IMAGE_NAME -q) ]]; then
		echo "+ Image unknown by docker daemon ..."
		load_image

		if [[ "$retval" != "0" ]]; then
			echo "...could not build/load container image!...giving up..."
			return -1
		fi
	fi

	if [[ -n "$(docker ps -aq)" ]]; then
		echo "+ cleanup running container"
		docker rm --force $(docker ps -aq) > /dev/null
	fi

	echo "+ start container..."
	echo "+ docker run $CONTAINER_RUN_OPTIONS $CONTAINER_BIND_MOUNT_STRING $CONTAINER_IMAGE_NAME"
	docker run $CONTAINER_RUN_OPTIONS $CONTAINER_BIND_MOUNT_STRING $CONTAINER_IMAGE_NAME

	if [[ "$?" != "0" ]]; then
		echo "...container start failed!...giving up..."
		return -1
	fi
	
	if [[ -n $RUNSCRIPT ]]; then
		echo "+ execute user runscript"
		/bin/bash $RUNSCRIPT
	fi 
}

main 

# keeping terminal open
bash