Skip to content

Commit 3c6350f

Browse files
committed
Add Podman support
1 parent 9bd4b07 commit 3c6350f

File tree

2 files changed

+108
-47
lines changed

2 files changed

+108
-47
lines changed

.github/workflows/test.yml

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,24 @@ on:
44
pull_request:
55
types: [opened, synchronize, reopened]
66
push:
7+
branches:
8+
- main
79
paths-ignore:
810
- 'README.md'
911
- '.editorconfig'
1012

1113
jobs:
1214
test:
13-
name: Test
15+
name: "Test on ${{ matrix.os }} with Podman: ${{ matrix.podman }}"
1416
runs-on: ${{ matrix.os }}
1517

1618
strategy:
1719
fail-fast: false
1820
matrix:
19-
os: [ubuntu-22.04, ubuntu-24.04]
21+
os:
22+
- ubuntu-22.04
23+
- ubuntu-24.04
24+
podman: [true, false]
2025

2126
steps:
2227
- name: Checkout
@@ -26,6 +31,13 @@ jobs:
2631
run: |
2732
curl -s https://bashunit.typeddevs.com/install.sh | bash
2833
34+
- name: Set up Podman
35+
if: matrix.podman == true
36+
run: |
37+
sudo snap remove docker
38+
sudo apt-get remove -y docker docker-engine docker.io containerd runc docker-ce docker-ce-cli
39+
sudo apt-get -y install podman podman-compose
40+
2941
- name: Run the tests
3042
run: |
3143
./lib/bashunit

start-local.sh

Lines changed: 94 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,9 @@ get_os_info() {
228228
}
229229

230230
# Check if a command exists
231-
available() { command -v "$1" >/dev/null; }
231+
available() {
232+
command -v "$1" >/dev/null;
233+
}
232234

233235
# Revert the status, removing containers, volumes, network and folder
234236
cleanup() {
@@ -354,7 +356,7 @@ create_api_key() {
354356
# parameter: the name of the container
355357
check_container_running() {
356358
container_name=$1
357-
containers="$(docker ps --format '{{.Names}}')"
359+
containers=$($docker_list_containers)
358360
if echo "$containers" | grep -q "^${container_name}$"; then
359361
echo "The docker container '$container_name' is already running!"
360362
echo "You can have only one running at time."
@@ -390,44 +392,91 @@ check_requirements() {
390392
exit 1
391393
fi
392394
need_wait_for_kibana=true
393-
# Check for "docker compose" or "docker-compose"
394-
set +e
395-
if ! docker compose >/dev/null 2>&1; then
396-
if ! available "docker-compose"; then
397-
if ! available "docker"; then
398-
echo "Error: docker command is required"
399-
echo "You can install it from https://docs.docker.com/engine/install/."
400-
exit 1
401-
fi
402-
echo "Error: docker compose is required"
403-
echo "You can install it from https://docs.docker.com/compose/install/"
395+
396+
# Initialize container runtime commands.
397+
398+
is_podman=false
399+
available "docker" && has_docker=true || has_docker=false
400+
available "podman" && has_podman=true || has_podman=false
401+
402+
if [ "$has_docker" = "false" ] && [ "$has_podman" = "false" ]; then
403+
echo "Error: Either Docker or Podman must be installed"
404+
echo "You can install docker from https://docs.docker.com/engine/install/."
405+
echo "You can install podman from https://podman.io/getting-started/installation/."
406+
exit 1
407+
fi
408+
409+
if [ "$has_docker" = "true" ]; then
410+
# Use Docker as container runtime.
411+
412+
docker_list_containers="docker ps --format '{{.Names}}'"
413+
docker_remove_image="docker rmi"
414+
415+
available "docker-compose" && has_docker_compose_v1=true || has_docker_compose_v1=false
416+
docker compose version >/dev/null 2>&1 && has_docker_compose_v2=true || has_docker_compose_v2=false
417+
418+
if [ "$has_docker_compose_v1" = "false" ] && [ "$has_docker_compose_v2" = "false" ]; then
419+
echo "Error: Docker Compose is required"
420+
echo "You can install it from https://docs.docker.com/compose/install/."
404421
exit 1
405422
fi
406-
docker="docker-compose up -d"
407-
docker_stop="docker-compose stop"
408-
docker_clean="docker-compose rm -fsv"
409-
docker_remove_volumes="docker-compose down -v"
410-
docker_version=$(docker-compose --version | head -n 1 | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+')
411-
if [ "$(compare_versions "$docker_version" "$min_docker_compose")" = "lt" ]; then
412-
echo "Unfortunately we don't support docker compose ${docker_version}. The minimum required version is $min_docker_compose."
413-
echo "You can migrate you docker compose from https://docs.docker.com/compose/migrate/"
414-
cleanup
415-
exit 1
416-
fi
417-
else
418-
docker_stop="docker compose stop"
419-
docker_clean="docker compose rm -fsv"
420-
docker_remove_volumes="docker compose down -v"
421-
docker_version=$(docker compose version | head -n 1 | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+')
422-
# --wait option has been introduced in 2.1.1+
423-
if [ "$(compare_versions "$docker_version" "2.1.0")" = "gt" ]; then
424-
docker="docker compose up --wait"
425-
need_wait_for_kibana=false
423+
424+
if [ "$has_docker_compose_v2" = "true" ]; then
425+
# docker-compose v2
426+
427+
docker_version=$(docker compose version | head -n 1 | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+')
428+
429+
# --wait option has been introduced in 2.1.1+
430+
if [ "$(compare_versions "$docker_version" "2.1.0")" = "gt" ]; then
431+
docker_up="docker compose up --wait"
432+
need_wait_for_kibana=false
433+
else
434+
docker_up="docker compose up -d"
435+
fi
436+
437+
docker_stop="docker compose stop"
438+
docker_clean="docker compose rm -fsv"
439+
docker_remove_volumes="docker compose down -v"
426440
else
427-
docker="docker compose up -d"
441+
# docker compose v1
442+
443+
docker_version=$(docker-compose --version | head -n 1 | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+')
444+
445+
if [ "$(compare_versions "$docker_version" "$min_docker_compose")" = "lt" ]; then
446+
echo "The minimum required version is of Docker Compose is '$min_docker_compose'. The currently installed version '${docker_version}' is not supported."
447+
echo "You can migrate you docker compose from https://docs.docker.com/compose/migrate/."
448+
cleanup
449+
exit 1
450+
fi
451+
452+
docker_up="docker-compose up -d"
453+
docker_stop="docker-compose stop"
454+
docker_clean="docker-compose rm -fsv"
455+
docker_remove_volumes="docker-compose down -v"
428456
fi
457+
458+
return
429459
fi
430-
set -e
460+
461+
available "podman-compose" && has_podman_compose=true || has_podman_compose=false
462+
463+
if [ "$has_podman_compose" = "false" ]; then
464+
echo "Error: Podman Compose is required"
465+
echo "You can install it from https://github.com/containers/podman-compose?tab=readme-ov-file#installation."
466+
exit 1
467+
fi
468+
469+
# Use Podman as container runtime.
470+
is_podman=true
471+
docker_version=$(podman --version | head -n 1 | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+')
472+
docker_list_containers="podman ps --format '{{.Names}}'"
473+
docker_remove_image="podman rmi"
474+
# Podman-compose does not support '--wait'.
475+
docker_up="podman-compose up -d"
476+
docker_stop="podman-compose stop"
477+
# Podman-compose does not support 'rm'.
478+
docker_clean="true"
479+
docker_remove_volumes="podman-compose down -v"
431480
}
432481

433482
check_installation_folder() {
@@ -586,7 +635,7 @@ if [ -z "\${ES_LOCAL_LICENSE:-}" ] && [ "\$today" -gt $expire ]; then
586635
echo "For more info about the license: https://www.elastic.co/subscriptions"
587636
echo
588637
echo "Updating the license..."
589-
$docker elasticsearch >/dev/null 2>&1
638+
$docker_up elasticsearch >/dev/null 2>&1
590639
result=\$(curl -s -X POST "\${ES_LOCAL_URL}/_license/start_basic?acknowledge=true" -H "Authorization: ApiKey \${ES_LOCAL_API_KEY}" -o /dev/null -w '%{http_code}\n')
591640
if [ "\$result" = "200" ]; then
592641
echo "✅ Basic license successfully installed"
@@ -601,7 +650,7 @@ if [ -z "\${ES_LOCAL_LICENSE:-}" ] && [ "\$today" -gt $expire ]; then
601650
fi
602651
echo
603652
fi
604-
$docker
653+
$docker_up
605654
EOM
606655

607656
if [ "$need_wait_for_kibana" = true ]; then
@@ -698,7 +747,7 @@ EOM
698747

699748
cat >> uninstall.sh <<- EOM
700749
if ask_confirmation; then
701-
if docker rmi "docker.elastic.co/elasticsearch/elasticsearch:${es_version}" >/dev/null 2>&1; then
750+
if $docker_remove_image "docker.elastic.co/elasticsearch/elasticsearch:${es_version}" >/dev/null 2>&1; then
702751
echo "Image docker.elastic.co/elasticsearch/elasticsearch:${es_version} removed successfully"
703752
else
704753
echo "Failed to remove image docker.elastic.co/elasticsearch/elasticsearch:${es_version}. It might be in use."
@@ -707,7 +756,7 @@ EOM
707756

708757
if [ "$esonly" = "false" ]; then
709758
cat >> uninstall.sh <<- EOM
710-
if docker rmi docker.elastic.co/kibana/kibana:${es_version} >/dev/null 2>&1; then
759+
if $docker_remove_image docker.elastic.co/kibana/kibana:${es_version} >/dev/null 2>&1; then
711760
echo "Image docker.elastic.co/kibana/kibana:${es_version} removed successfully"
712761
else
713762
echo "Failed to remove image docker.elastic.co/kibana/kibana:${es_version}. It might be in use."
@@ -717,7 +766,7 @@ EOM
717766

718767
if [ "$edot" = "true" ]; then
719768
cat >> uninstall.sh <<- EOM
720-
if docker rmi docker.elastic.co/elastic-agent/elastic-edot-collector:${es_version} >/dev/null 2>&1; then
769+
if $docker_remove_image docker.elastic.co/elastic-agent/elastic-edot-collector:${es_version} >/dev/null 2>&1; then
721770
echo "Image docker.elastic.co/elastic-agent/elastic-edot-collector:${es_version} removed successfully"
722771
else
723772
echo "Failed to remove image docker.elastic.co/elastic-agent/elastic-edot-collector:${es_version}. It might be in use."
@@ -859,7 +908,7 @@ EOM
859908
fi
860909

861910
# Fix for OCI issue on LXC, see https://github.com/elastic/start-local/issues/27
862-
if ! detect_lxc; then
911+
if ! detect_lxc && [ "$is_podman" = "false" ]; then
863912
cat >> docker-compose.yml <<-'EOM'
864913
ulimits:
865914
memlock:
@@ -997,11 +1046,11 @@ print_steps() {
9971046

9981047
running_docker_compose() {
9991048
# Execute docker compose
1000-
echo "- Running ${docker}"
1049+
echo "- Running ${docker_up}"
10011050
echo
10021051
set +e
1003-
if ! $docker; then
1004-
error_msg="Error: ${docker} command failed!"
1052+
if ! $docker_up; then
1053+
error_msg="Error: ${docker_up} command failed!"
10051054
echo "$error_msg"
10061055
if [ "$esonly" = "true" ]; then
10071056
generate_error_log "${error_msg}" "${elasticsearch_container_name}"
@@ -1094,4 +1143,4 @@ ctrl_c() {
10941143
trap ctrl_c INT
10951144

10961145
# Execute the script
1097-
main "$@"
1146+
main "$@"

0 commit comments

Comments
 (0)