-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathentrypoint.sh
More file actions
executable file
·91 lines (83 loc) · 2.63 KB
/
Copy pathentrypoint.sh
File metadata and controls
executable file
·91 lines (83 loc) · 2.63 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
#!/bin/sh
# Create image to be mounted at /var/lib/docker
DOCKER_VOLUME_FILE=${DOCKER_VOLUME_FILE:-/tmp/var-lib-docker-${RANDOM}.qcow2}
if [ ! -f ${DOCKER_VOLUME_FILE} ]; then
qemu-img create -q -f qcow2 ${DOCKER_VOLUME_FILE} ${DOCKER_VOLUME_SIZE}
fi
# Abuse the /dev tmpfs mount for temporary files
mkdir -p /tmp
# Start QEMU, using this container's root filesystem
KVM=$([ -c /dev/kvm ] && echo "-enable-kvm" || echo "")
qemu-system-x86_64 -smp 1 -m ${MEMORY} -nodefaults ${KVM} \
-no-reboot -no-user-config -nographic -display none \
-kernel /boot/vmlinuz-virt -initrd /boot/initramfs-virt \
-append "root=rootfs ro rootfstype=9p rootflags=trans=virtio console=ttyS0 nomodeset" \
`# Console` \
-chardev socket,path=/tmp/console.sock,server=on,wait=off,logfile=/tmp/qemu.log,id=console \
-serial chardev:console \
`# PID` \
-pidfile /tmp/qemu.pid \
`# Root filesystem, from the main container` \
-virtfs local,path=/,mount_tag=rootfs,security_model=none,multidevs=remap \
`# Docker disk` \
-drive file=${DOCKER_VOLUME_FILE},format=qcow2,if=virtio,cache=writeback \
`# Network interface` \
-nic user,model=virtio-net-pci,hostfwd=tcp::2375-:2375 \
`# Guest agent socket` \
-device virtio-serial \
-chardev socket,path=/tmp/qga.sock,server=on,wait=off,id=qga0 \
-device virtserialport,chardev=qga0,name=org.qemu.guest_agent.0 \
`# Daemonize on startup` \
-daemonize
# Wait for QEMU
echo -n "Waiting for QEMU..."
TIMEOUT=${QEMU_TIMEOUT_START}
while [ "${TIMEOUT}" -gt 0 -a ! -f /tmp/qemu.pid ]; do
TIMEOUT=$((${TIMEOUT}-1))
echo -n "."
sleep 1
done
if [ ${TIMEOUT} -le 0 ]; then
echo " [TIMEOUT]"
exit 1
fi
echo " [OK]"
# Wait for docker
echo -n "Waiting for dockerd..."
TIMEOUT=${DOCKER_TIMEOUT_START}
while [ "${TIMEOUT}" -gt 0 -a "$(wget --timeout 1 --quiet --output-document - http://127.0.0.1:2375/_ping 2>/dev/null)" != "OK" ]; do
TIMEOUT=$((${TIMEOUT}-1))
echo -n "."
sleep 1
done
if [ ${TIMEOUT} -le 0 ]; then
echo " [TIMEOUT]"
exit 1
fi
echo " [OK]"
# Run command
if [ "$#" -gt 0 ]; then
$@
else
sh
fi
# Stop QEMU
echo -n "Waiting for QEMU to shutdown..."
echo '{ "execute": "guest-shutdown" }' | nc local:/tmp/qga.sock
PID=$(cat /tmp/qemu.pid)
TIMEOUT=${QEMU_TIMEOUT_STOP}
while [ "${TIMEOUT}" -gt 0 -a -d /proc/${PID} ]; do
TIMEOUT=$((${TIMEOUT}-1))
echo -n "."
sleep 1
done
if [ "${TIMEOUT}" -le 0 ]; then
echo " timeout, ignoring [OK]"
else
echo " [OK]"
fi
# Remove docker volume image
DOCKER_VOLUME_REMOVE=${DOCKER_VOLUME_REMOVE:-true}
if [ ${DOCKER_VOLUME_REMOVE} != "false" ]; then
rm -f ${DOCKER_VOLUME_FILE}
fi