Deploying the Plumber service in a Docker container#
This page provides instructions on how to deploy the plumber
service in a Docker container. It takes as a starting point a standard Squirro cloud instance, which runs the plumber
service directly on the host, and guides you through the steps to deploy the service in a Docker container. All the steps assume that you are logged in with a normal user that has sudo privileges.
Disable the host-level plumber service#
Firstly, verify that the plumber
service is running on the host:
# all the Squirro services report OK (plumber included)
squirro_status
# ensure that the host-level service of plumber is up and running
sudo systemctl status sqplumberd
Then, we stop the plumber
service:
# stop and disable the plumber service for now
sudo systemctl stop sqplumberd
sudo systemctl disable sqplumberd
# verify
squirro_status
sudo systemctl status sqplumberd
Modify plumber.ini#
We make copies of the existing plumber.ini
file:
sudo cp -p /etc/squirro/plumber.ini /etc/squirro/plumber.ini.host
sudo cp -p /etc/squirro/plumber.ini /etc/squirro/plumber.ini.docker
Then, we perform two modifications to the plumber.ini.docker
file:
Replace any occurrence of
localhost
withhost.docker.internal
Make sure that the following config options exist, otherwise, append them:
[redis_cache]
host = host.docker.internal
[redis_bytes_cache]
host = host.docker.internal
[redis_database_migrations]
host = host.docker.internal
[squirro_client]
squirro_cluster = http://host.docker.internal
[services]
user = http://host.docker.internal:81/api/user
The following script can be used to automate the modifications to the plumber.ini.docker
file:
docker_plumber_ini='/etc/squirro/plumber.ini.docker'
# Replace 'localhost' with 'host.docker.internal'
sudo sed -i 's/localhost/host.docker.internal/g' "$docker_plumber_ini"
declare -A section_option_map
section_option_map["redis_cache"]="host = host.docker.internal"
section_option_map["redis_bytes_cache"]="host = host.docker.internal"
section_option_map["redis_database_migrations"]="host = host.docker.internal"
section_option_map["squirro_client"]="squirro_cluster = http://host.docker.internal"
section_option_map["services"]="user = http://host.docker.internal:81/api/user"
# Loop through all sections and append if they do not exist
for section in "${!section_option_map[@]}"; do
echo "Checking section: [$section]"
if ! sudo grep -q "^\[$section\]" "$docker_plumber_ini"; then
echo "Adding section: [$section]"
echo -e "\n[$section]\n${section_option_map[$section]}" | sudo tee -a "$docker_plumber_ini" > /dev/null
else
echo "Section exists: [$section]"
fi
done
Finally, we replace the current plumber.ini
with the edited plumber.ini.docker
file:
sudo cp -p -f /etc/squirro/plumber.ini.docker /etc/squirro/plumber.ini
Note
podman
uses host.containers.internal
instead of host.docker.internal
Note
The script above assumes that if the sections of the aforementioned config options already exist in the file, that they also define the listed config options. In most cases, this should be true. If not, please adjust accordingly.
Modify Redis config files#
The plumber
service uses the two Redis servers that come with the Squirro deployment. Therefore, we make sure that they are configured in a way to allow communication from the Docker container of the plumber
service.
# for backup
sudo cp -p /etc/redis/redis.conf /etc/redis/redis.conf.original
sudo cp -p /etc/redis/cache.conf /etc/redis/cache.conf.original
# append the 172.17.0.1 address to the bind directive
sudo sed -i 's/bind 127\.0\.0\.1 -::1/bind 127\.0\.0\.1 -::1 172.17.0.1/g' /etc/redis/redis.conf
sudo sed -i 's/bind 127\.0\.0\.1 -::1/bind 127\.0\.0\.1 -::1 172.17.0.1/g' /etc/redis/cache.conf
# restart both services to apply changes
sudo systemctl restart redis-server && sudo systemctl restart redis-server-cache
Note
podman
uses 10.88.0.1
instead of 172.17.0.1
Optionally, to verify that they have been configured correctly, you can launch a Python interpreter from Squirro’s virtual environment (squirro_activate
), and execute the following (adjust Redis passwords):
import redis
redis_server_password, redis_server_cache_password = "pwd", "pwd"
for port, password in ((6379, redis_server_password), (6380, redis_server_cache_password)):
assert redis.Redis("172.17.0.1", port=port, password=password).ping()
Enable the containerized plumber service#
The last step involves updating the systemd unit file of the plumber service to manage its containerized version.
# copy the docker-enabled systemd unit file and create backup for the host-level one
cd /usr/lib/systemd/system
sudo cp -p sqplumberd.service sqplumberd.service.host
sudo cp /etc/squirro/plumber.d/sqplumberd.service sqplumberd.service.docker
sudo cp -p -f sqplumberd.service.docker sqplumberd.service
# download the image from the internal registry before starting the container
sudo docker pull $(grep 'mirror.squirro.net' /etc/squirro/plumber.d/run.sh | tr -d '"')
# reload the systemd unit files and start the docker-enabled sqplumberd service
sudo systemctl daemon-reload
sudo systemctl start sqplumberd
sudo systemctl enable sqplumberd
Now, the plumber
service should be up and running from the Docker container.
You can verify that by checking:
the output of
systemctl status sqplumberd
(theplumber.d/run.sh
should be listed in the output)the output of
docker ps
(the containersquirro-service-plumber
should be listed in the output)
To debug any issues with getting the plumber container up and running, you can use:
journalctl -u sqplumberd -f