forked from mzedeler/dsh
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdsh
executable file
·128 lines (115 loc) · 4.88 KB
/
dsh
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#!/bin/sh
# Parameter parsing
while test $# != 0 -a "$1" != "--"; do
case $1 in
-b|--build) OPT_BUILD=1 ;;
-s|--samba) OPT_SAMBA=1 ;;
--host-workspace) OPT_HOST_WORKSPACE=$2; shift ;;
--docker-package) OPT_DOCKER_PACKAGE=$2; shift ;;
--docker-version) OPT_DOCKER_VERSION=$2; shift ;;
-i) OPT_IMAGE=$2; shift ;;
-d) OPT_DETACH=1 ;;
*) DOCKER_OPTS="${DOCKER_OPTS} $1" ;;
esac
shift
done
BASE_IMAGE=phusion/baseimage
if test -n "$OPT_IMAGE"; then
DSH_IMAGE="$OPT_IMAGE"
else
if docker images | grep -e '^dsh-custom[[:space:]]' >/dev/null; then
DSH_IMAGE=dsh-custom
else
DSH_IMAGE=dsh
if test -n "$OPT_BUILD" -o -z "$(docker images | grep '^dsh[[:space:]]')"; then
echo 'Building dsh image'
DOCKER_VERSION=${OPT_DOCKER_VERSION-$(docker -v | awk '{print $3}' | tr -d ,)}
ARCH='amd64'
# Community edition - correction of version number for apt
DOCKER_VERSION=$(echo $DOCKER_VERSION | sed 's/-ce$/~ce/')
PHUSION_VERSION=$(docker run --rm $BASE_IMAGE lsb_release -cs)
# Due to change in name of docker-engine packages from v1.12.4 which also contains name of distribution
PHUSION_DIST=$(docker run --rm $BASE_IMAGE lsb_release -is | awk '{print tolower($0)}')
DOCKER_PACKAGE=${OPT_DOCKER_PACKAGE-docker-ce=$DOCKER_VERSION-0~$PHUSION_DIST}
# Docker is now downloaded from download.docker.com and versions below 17.06.0 shouldn't be tried!
docker build -t dsh - <<END_DOCKERFILE
FROM $BASE_IMAGE
# RUN apt-get install apt-transport-https ca-certificates
RUN apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 9DC858229FC7DD38854AE2D88D81803C0EBFCD88
RUN echo deb [arch=$ARCH] https://download.docker.com/linux/ubuntu $PHUSION_VERSION stable > /etc/apt/sources.list.d/docker.list
RUN apt-get update && apt-get install -y $DOCKER_PACKAGE
RUN perl -pe s{root:/root}{root:/workspace} -i /etc/passwd
END_DOCKERFILE
fi
fi
fi
# The rest of the parameters after -- will be passed to the shell inside dsh
if test "$1" = "--"; then
shift
fi
if test -n "$OPT_DETACH"; then
DOCKER_OPTS="$DOCKER_OPTS -d"
else
# If not running in detached mode, attach stdio and cleanup on exit
DOCKER_OPTS="$DOCKER_OPTS --rm -i"
# If running in terminal, add -t flag
if test -t 1; then
DOCKER_OPTS="$DOCKER_OPTS -t"
fi
fi
if test -n "$OPT_HOST_WORKSPACE"; then
DOCKER_OPTS="$DOCKER_OPTS -v $(readlink -f $OPT_HOST_WORKSPACE):/workspace"
else
DOCKER_OPTS="$DOCKER_OPTS --volumes-from dsh-ws"
fi
# Set up environment for connecting to docker
if test -n "$(uname -a | grep boot2docker)"; then
# Running inside boot2docker vm
HOST_IP=$(ifconfig eth0 | grep 'inet addr:' | awk -F: '{print $2}' | awk '{print $1}')
DOCKER_PARAMS="--add-host boot2docker:$HOST_IP"
DOCKER_PARAMS="$DOCKER_PARAMS -e DOCKER_HOST=tcp://boot2docker:2376"
DOCKER_PARAMS="$DOCKER_PARAMS -e DOCKER_CERT_PATH=/etc/docker-certs"
DOCKER_PARAMS="$DOCKER_PARAMS -e DOCKER_TLS_VERIFY=1"
DOCKER_PARAMS="$DOCKER_PARAMS -v /var/lib/boot2docker/tls:/etc/docker-certs"
else
# Using docker on some other system
DOCKER_PARAMS=" -v /var/run/docker.sock:/var/run/docker.sock"
if test ! -z $DOCKER_CERT_PATH; then
DOCKER_PARAMS="$DOCKER_PARAMS -v $DOCKER_CERT_PATH:/etc/docker-certs"
DOCKER_PARAMS="$DOCKER_PARAMS -e DOCKER_CERT_PATH=/etc/docker-certs"
fi
if test ! -z $DOCKER_TLS_VERIFY ; then
DOCKER_PARAMS="$DOCKER_PARAMS -e DOCKER_TLS_VERIFY=$DOCKER_TLS_VERIFY"
fi
if test -f $HOME/.gitconfig; then
DOCKER_OPTS="$DOCKER_OPTS -v $HOME/.gitconfig:/workspace/.gitconfig"
fi
if test -n "$SSH_AUTH_SOCK"; then
DOCKER_OPTS="$DOCKER_OPTS -v $(dirname $SSH_AUTH_SOCK):/tmp/ssh-agent"
DOCKER_OPTS="$DOCKER_OPTS -e SSH_AUTH_SOCK=/tmp/ssh-agent/$(basename $SSH_AUTH_SOCK)"
fi
fi
# Set up data container for workspace (if it doesn't exist already)
EXIT_CODE=$(docker inspect --format "{{.State.ExitCode}}" dsh-ws 2>/dev/null)
if test ${EXIT_CODE:-1} != 0; then
docker run -t --name dsh-ws -v /workspace busybox true 2>/dev/null
docker run --rm --volumes-from=dsh-ws $BASE_IMAGE /bin/bash -c "cp /etc/skel/.* /workspace/ 2>/dev/null"
fi
if test -n "$OPT_SAMBA"; then
# Start samba file sharing (if it hasn't started already)
RUNNING=$(docker inspect --format "{{.State.Running}}" samba-server 2>/dev/null)
if test ${RUNNING:-false} = false; then
docker run -e USER=root -e USERID=0 --rm -v "$(which docker):/docker" -v /var/run/docker.sock:/docker.sock svendowideit/samba dsh-ws
fi
fi
if test -z "$1"; then
if test -z "$OPT_DETACH"; then
set -- /bin/sh -c '/bin/login -f root -p'
fi
fi
# Now run the docker shell container
docker run $DOCKER_PARAMS \
$DOCKER_OPTS \
-e HOME=/workspace \
-w /workspace \
$DSH_IMAGE "$@"