-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdocker-bash.sh
executable file
·227 lines (175 loc) · 6.27 KB
/
docker-bash.sh
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
# Project paths
export DOCKERBASH_PATH="$( builtin cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
export DISTRO_IMAGES=(`ls ${DOCKERBASH_PATH}/distributions/`)
export DOCKERBASH_ALIASES="$DOCKERBASH_PATH/bash_aliases.sh"
# Configuration
export DEFAULT_CONTAINER_NAME='docker-bash'
export DEFAULT_CONTAINER_NAME_TMP='tmp-shell'
# Setup
if hash podman 2>/dev/null; then
export DOCKERBASH_PROGRAM='podman'
elif hash docker 2>/dev/null; then
export DOCKERBASH_PROGRAM='docker'
else
echo There is not containerization software installed!;
fi
# Autocompletion
source $DOCKERBASH_PATH/docker-bash-completion.bash
# Usage
alias db='_docker-bash-magic'
alias db-tmp='_db-tmp'
alias db-delete='_docker-bash-delete-container'
# Setup
# Must be executed once before being able to use db, or when updates were made to the docker file
alias db-rebuild-image-from-scratch='_rebuild_from_scratch'
alias db-rebuild-image='_select_distro && (db-cd && builtin cd distributions/$IMAGE_DISTRO && $DOCKERBASH_PROGRAM build --tag=$IMAGE_NAME . )'
# Utilities
alias db-cd='builtin cd $DOCKERBASH_PATH'
alias db-list='_db_list'
alias db-list-names-only='_docker-bash-list-container-names-only'
# Shortcuts
alias db-ls='db-list'
alias db-ls-verbose='_db_list_verbose'
alias db-ls-names='db-list-names-only'
alias db-rm='db-delete'
# Creates a non-existing container
function _select_distro() {
if [[ -v DISTRO_SELECTED ]]; then
return 0;
fi
PS3='Which image do you want to use? '
select value in "${DISTRO_IMAGES[@]}"
do
if [[ " ${DISTRO_IMAGES[@]} " =~ " ${value} " ]]; then
export IMAGE_DISTRO="$value";
export IMAGE_NAME="$DEFAULT_CONTAINER_NAME-$value";
echo Using $value;
break;
fi
echo "Option '$REPLY' does not exist.";
done
}
function _db_run_template() {
# Use this variable to create the command step by step
local cmd="$DOCKERBASH_PROGRAM run -it --hostname=$CONTAINER_NAME --name=$CONTAINER_NAME --net=host "
cmd="$cmd --volume=$HOME:/host"
cmd="$cmd --volume=$DOCKERBASH_ALIASES:/root/.bash_aliases"
# Use certain dot-files from the host sytem
if [ -f $HOME/.inputrc ]; then
cmd="$cmd --volume=$HOME/.inputrc:/root/.inputrc"
fi
if [ -f $HOME/.tmux.conf ]; then
cmd="$cmd --volume=$HOME/.tmux.conf:/root/.tmux.conf"
fi
if [ -f $HOME/.vimrc ]; then
cmd="$cmd --volume=$HOME/.vimrc:/root/.vimrc"
fi
# Enable support for UI applicaitons
cmd="$cmd --env DISPLAY"
cmd="$cmd --volume=/tmp/.X11-unix:/tmp/.X11-unix"
# Add all arguments to the command
#echo $cmd
cmd="$cmd $@"
${cmd}; # Execute the command
}
function _db_pre_start() {
#clear
#echo
#echo "**Instructions**"
#echo "To use x11 apps you have to execute 'xhost +' on the host";
#echo
#echo
echo "Using docker-bash '$CONTAINER_NAME'";
}
function _docker-bash-magic() {
export CONTAINER_NAME=${1:-$DEFAULT_CONTAINER_NAME}
mkdir "/tmp/DockerBash/$CONTAINER_NAME" -p
$DOCKERBASH_PROGRAM inspect -f "{{.State.Running}}" $CONTAINER_NAME > /dev/null 2>&1;
local exists=$? # Docker: 0=existing 1=non-existing # Podman: 125=non-existing
if [ $exists -ne 0 ]; then
echo "Initializing docker container for the first time.";
_select_distro;
_db_pre_start;
_db_run_template $IMAGE_NAME;
else
running=`$DOCKERBASH_PROGRAM inspect -f "{{.State.Running}}" $CONTAINER_NAME`;
if [ "$running" != "true" ]; then
$DOCKERBASH_PROGRAM start $CONTAINER_NAME > /dev/null 2>&1 # Starts a not-running container
fi
_db_pre_start
$DOCKERBASH_PROGRAM exec -it $CONTAINER_NAME bash # Allows connecting multiple times at the same time; Using `docker exec -it` is necessary because `docker start -i` would share the shell/inputs with _db-start!
fi
}
function _db-tmp(){
_select_distro
local suffix=`echo $RANDOM | md5sum | head -c 5`
export CONTAINER_NAME=${1:-$DEFAULT_CONTAINER_NAME_TMP}-${suffix}
_db_pre_start
_db_run_template --rm $IMAGE_NAME
}
function _docker-bash-delete-container() {
export CONTAINER_NAME=${1:-$DEFAULT_CONTAINER_NAME}
# Ask for user confirmation
echo
read -r -p "Delete DockerBash container '$CONTAINER_NAME'? [Y/n] " response
response=${response,,} # tolower
if [[ $response =~ ^(yes|y| ) ]] || [[ -z $response ]]; then
# Delete container
$DOCKERBASH_PROGRAM stop $CONTAINER_NAME > /dev/null 2>&1
$DOCKERBASH_PROGRAM rm $CONTAINER_NAME > /dev/null 2>&1
echo "Docker-bash container '$CONTAINER_NAME' has been deleted."
fi
}
function _docker-bash-list-container-names-only() {
for IMAGE in "${DISTRO_IMAGES[@]}"
do
if [ $DOCKERBASH_PROGRAM = "docker" ]; then
$DOCKERBASH_PROGRAM container ls --all --filter ancestor="$DEFAULT_CONTAINER_NAME-$IMAGE" | awk 'NF>1{print $NF}' | tail -n +2
elif [ $DOCKERBASH_PROGRAM = "podman" ]; then
$DOCKERBASH_PROGRAM container ls --all --filter ancestor="localhost/$DEFAULT_CONTAINER_NAME-$IMAGE:latest" | awk 'NF>1{print $NF}' | tail -n +2
fi
done
}
function _db_list() {
for IMAGE in "${DISTRO_IMAGES[@]}"
do
local num_lines;
if [ $DOCKERBASH_PROGRAM = "docker" ]; then
num_lines=$($DOCKERBASH_PROGRAM container ls --all --filter ancestor="$DEFAULT_CONTAINER_NAME-$IMAGE" | wc -l)
elif [ $DOCKERBASH_PROGRAM = "podman" ]; then
num_lines=$($DOCKERBASH_PROGRAM container ls --all --filter ancestor="localhost/$DEFAULT_CONTAINER_NAME-$IMAGE:latest" | wc -l)
fi
if [ $num_lines -gt 1 ]; then
echo "$IMAGE"
if [ $DOCKERBASH_PROGRAM = "docker" ]; then
echo "`$DOCKERBASH_PROGRAM container ls --all --filter ancestor="$DEFAULT_CONTAINER_NAME-$IMAGE" | awk 'NF>1{print " └─ " $NF}' | tail -n +2`"
elif [ $DOCKERBASH_PROGRAM = "podman" ]; then
echo "`$DOCKERBASH_PROGRAM container ls --all --filter ancestor="localhost/$DEFAULT_CONTAINER_NAME-$IMAGE:latest" | awk 'NF>1{print " └─ " $NF}' | tail -n +2`"
fi
echo
fi
done
}
function _db_list_verbose() {
echo;
for IMAGE in "${DISTRO_IMAGES[@]}"
do
echo "$IMAGE";
if [ $DOCKERBASH_PROGRAM = "docker" ]; then
$DOCKERBASH_PROGRAM container ls --all --filter ancestor="$DEFAULT_CONTAINER_NAME-$IMAGE";
elif [ $DOCKERBASH_PROGRAM = "podman" ]; then
$DOCKERBASH_PROGRAM container ls --all --filter ancestor="localhost/$DEFAULT_CONTAINER_NAME-$IMAGE:latest";
fi
echo;
done
}
function _rebuild_from_scratch()
{
(
_select_distro;
local DISTRO_SELECTED="$IMAGE_NAME";
$DOCKERBASH_PROGRAM image rm "$IMAGE_NAME";
db-rebuild-image;
unset DISTRO_SELECTED;
)
}