ec2_post_init
Populate STScI EC2 instances with ease
docker.inc.sh
Go to the documentation of this file.
1## @file
2## @brief Docker functions
3## @details
4## @section docker_example Example
5## @include docker_setup.sh
6
7(( $EC2PINIT_DOCKER_INCLUDED )) && return
8EC2PINIT_DOCKER_INCLUDED=1
9source ec2pinit.inc.sh
10
11## @fn docker_setup()
12## @brief Install docker on the server
13## @param user account to add to docker group
14## @param bind_port binds the docker daemon to a TCP port. When this option is
15## enabled the ``user`` account argument is ignored in favor of setting
16## ``DOCKER_HOST=tcp://127.0.0.1:${bind_port}`` at login
18 local user="${1:-$USER}"
19 local bind_port=
20 if (( ! HAVE_SUPPORT )); then
21 io_error "docker_setup: unsupported operating system"
22 fi
23
24 # TODO: Generalize the following init blocks
25 io_info "docker_setup: Installing docker"
26 if (( HAVE_DEBIAN )); then
27 # see: https://docs.docker.com/engine/install/debian/
28 sys_pkg_install apt-transport-https ca-certificates curl gnupg lsb-release sudo
29 if [ ! -f "/etc/apt/keyrings/docker.gpg" ]; then
30 sudo mkdir -p /etc/apt/keyrings
31 curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
32 fi
33 if [ ! -f "/etc/apt/sources.list.d/docker.list" ]; then
34 echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" \
35 | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
36 fi
37 sys_pkg_install docker-ce docker-ce-cli containerd.io docker-compose
38 elif (( HAVE_UBUNTU )); then
39 # see: https://docs.docker.com/engine/install/ubuntu/
40 sys_pkg_install apt-transport-https ca-certificates curl gnupg lsb-release sudo
41 if [ ! -f "/etc/apt/keyrings/docker.gpg" ]; then
42 sudo mkdir -p /etc/apt/keyrings
43 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
44 fi
45 if [ ! -f "/etc/apt/sources.list.d/docker.list" ]; then
46 echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
47 | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
48 fi
49 sys_pkg_install docker-ce docker-ce-cli containerd.io docker-compose
50 elif (( HAVE_REDHAT )); then
51 # see: https://docs.docker.com/engine/install/centos/
52 if [ ! -f /etc/yum.repos.d/docker-ce.repo ]; then
53 yum-config-manager --add-repo \
54 https://download.docker.com/linux/centos/docker-ce.repo
55 fi
56 sys_pkg_install docker-ce docker-ce-cli containerd.io docker-compose-plugin
57 else
58 io_warn "docker_setup: Operating system was not recognized. Blindly attempting to install docker." >&2
59 sys_pkg_install docker docker-compose
60 fi
61
62 # Enable the system service
63 io_info "docker_setup: Enabling docker"
64 systemctl enable docker
65
66 if [ -n "$bind_port" ] && [[ $bind_port =~ [0-9]+ ]]; then
67 # Allow any local account to use the docker API port
68 io_info "docker_setup: Binding docker to port 127.0.0.1:${bind_port}"
69 mkdir -p /etc/systemd/system/docker.service.d
70cat << CONFIG > /etc/systemd/system/docker.service.d/override.conf
71[Service]
72ExecStart=
73ExecStart=/usr/bin/dockerd -H 127.0.0.1:${bind_port} --containerd=/run/containerd/containerd.sock
74CONFIG
75 echo "DOCKER_HOST=tcp://127.0.0.1:${bind_port}" > /etc/profile.d/docker_host.sh
76 source /etc/profile.d/docker_host.sh
77 else
78 # Only the named can use docker
79 io_info "docker_setup: adding $user to docker group"
80 docker_user_add "$user"
81 fi
82
83 io_info "docker_setup: Reloading systemd"
84 systemctl daemon-reload
85 io_info "docker_setup: Starting docker"
86 systemctl start docker
87}
88
89## @fn docker_user_add()
90## @brief Add a user account to the ``docker`` group
91## @param user an account to modify (must exist)
93 local user="${1:-$USER}"
94 if groups "$user" | grep docker; then
95 usermod -a -G docker "$user"
96 fi
97}
98
99## @fn docker_pull_many()
100## @brief Wrapper for ``docker pull``
101## @details Pull multiple docker images with a single command
102## @param image... image to pull
103##
104## ~~~{.sh}
105## images=(centos:7 centos:8)
106## docker_pull_many "${images[@]}"
107## # or
108## docker_pull_many "centos:7" "centos:8"
109## ~~~
111 local image=($@)
112 local image_count="${#image[@]}"
113 local error_count=0
114
115 if [ -z "$image_count" ]; then
116 return 1
117 fi
118
119 io_info "Pulling $image_count image(s)..."
120 for ((i = 0; i < image_count; i++)); do
121 io_info "Image #$((i+1)): ${image[i]}"
122 if ! docker pull "${image[$i]}"; then
123 (( error_count++ ))
124 fi
125 done
126 (( error_count )) && return 1
127}
io_warn(...)
Print a warning message.
Definition: io.inc.sh:44
io_info(...)
Print a message.
Definition: io.inc.sh:29
io_error(...)
Print an error message.
Definition: io.inc.sh:59
Exported String HAVE_UBUNTU
System is based on Ubuntu.
Definition: system.inc.sh:27
sys_pkg_install(...)
Install a system package.
Definition: system.inc.sh:244
Exported String HAVE_SUPPORT
System is supported.
Definition: system.inc.sh:33
Exported String HAVE_DEBIAN
System is based on Debian.
Definition: system.inc.sh:24
Exported String HAVE_REDHAT
System is based on Red Hat.
Definition: system.inc.sh:21
docker_user_add(user)
Add a user account to the docker group.
Definition: docker.inc.sh:92
docker_setup(user, bind_port)
Install docker on the server.
Definition: docker.inc.sh:17
docker_pull_many(image...)
Wrapper for docker pull
Definition: docker.inc.sh:110