Coder Social home page Coder Social logo

marhkb / pods Goto Github PK

View Code? Open in Web Editor NEW
687.0 10.0 15.0 10.76 MB

Keep track of your podman containers

License: GNU General Public License v3.0

Shell 0.19% Meson 0.66% CSS 0.63% Rust 98.09% Python 0.44%
gnome podman gtk4 rust gtk4-rs linux libadwaita

pods's Introduction

Pods
Pods

Manage your Podman containers

Download on Flathub

Translation status CI status Flathub downloads


Preview Preview

Pods is a frontend for podman. It uses libadwaita for its user interface and strives to meet the design principles of GNOME.

With Pods you can, among other things:

  • Connect to local and remote Podman instances.
  • Easily overview images, containers and pods.
  • View prepared information about images, containers, and pods.
  • Inspect images, containers and pods.
  • View and search container logs.
  • Monitor processes of containers and pods.
  • Download images and build them using Dockerfiles.
  • Create pods and containers.
  • Control the lifecycle of containers and pods (in bulk) (start, stop, pause, etc.).
  • Delete images, containers, and pods (in bulk).
  • Prune images.
  • Rename containers.

🔌 Installation

Install Pods from flathub by issuing

flatpak install com.github.marhkb.Pods

Pods can be kept up to date by issuing flatpak's update command like

flatpak update

You can also grab the latest CI build from here. Then you need to unzip the archive's content and install the application with the command flatpak install pods.flatpak. Keep in mind that you have to manually repeat this procedure to update the application

🏗️ Building from source

GNOME Builder

GNOME Builder is the environment used for developing this application. It can use Flatpak manifests to create a consistent building and running environment cross-distro. Thus, it is highly recommended you use it.

  1. Download GNOME Builder.
  2. In Builder, click the "Clone Repository" button at the bottom, using https://github.com/marhkb/pods.git as the URL.
  3. Click the build button at the top once the project is loaded.

Meson

Prerequisites

The following packages are required to build Pods:

  • meson >= 0.59
  • ninja
  • appstream-glib (for checks)
  • cargo
  • glib2 >= 2.66
  • gtk4 >= 4.10
  • libadwaita >= 1.3
  • gtksourceview > 4.90
  • vte-2.91-gtk4 >= 0.70

Build Instruction

git clone https://github.com/marhkb/pods.git
cd pods
meson _build --prefix=/usr/local
ninja -C _build install

🙌 Help translate Pods

You can help Pods translate into your native language. If you found any typos or think you can improve a translation, you can use the Weblate platform.

👨‍💻️ Code of Conduct

We adhere to the GNOME Code of Conduct and expect all communications within this project to comply with it.

💝 Acknowledgment

The library podman-api-rs provides a rust interface to the Podman API. Without this great project, Pods would probably never have come into existence.

I also wanted to thank SeaDve, from whom I took the gettext python script and whose projects like Kooha and Mousai served as inspiration for the README.

And also, a warm thank you to all the contributors and translators from Weblate.

pods's People

Contributors

abdelhak2406 avatar albanobattistella avatar allaeddineomc avatar boffire avatar comradekingu avatar daudix avatar flipflop97 avatar iklabib avatar kianmeng avatar lenemter avatar loooptools avatar marhkb avatar minpeter avatar ogarcia avatar oscfdezdz avatar pervoj avatar rafaelmardojai avatar rene-coty avatar rffontenelle avatar rmnscnce avatar santossi avatar sekalengrengginang avatar shoodle avatar sky96111 avatar softexpert avatar somuchforsubtlety avatar starise avatar vv9k avatar wgklink avatar xfgusta avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pods's Issues

Fails to start - bwrap: Can't create file at /run/systemd/journal/socket: No such device or address

Installed Pods from the CI then used flatpak install pods.flatpak:

com.github.marhkb.Pods.Devel permissions:
    ipc       fallback-x11       session-bus          wayland
    x11       dri                file access [1]

    [1] /run/systemd/journal, xdg-run/podman:ro


        ID                           Branch Op Remote       Download
 1. [✓] com.github.marhkb.Pods.Devel master i  devel-origin 0 bytes

Installation complete.

Running gives an error:

$ /usr/bin/flatpak run --branch=master --arch=x86_64 --command=pods com.github.marhkb.Pods.Devel

bwrap: Can't create file at /run/systemd/journal/socket: No such device or address

Looks like a great piece of software though, can definitely see it being super useful!

Possibility of running without Podman service

Hello

I was wondering if it was a conscious choice of requiring the Podman service to be running? I often use Podman, and am aware that this service exists since a while ago, but always thought one of the main benefits of Podman was that it, unlike Docker, could be used daemonless (if the service can be called that), so I've never used the service before.

Most of the information I can see in the screenshots is also available from the CLI commands that don't require the daemon, but I understand that it might be easier to talk to the daemon, as it probably uses a more exchangeable format suitable for interaction with external tools?

Thanks!

Logs font size

Describe your feature request

I find the logs font to be too small, I wish there was a way to make it bigger. Shortcuts like CTRL + +/CTRL + - would be a great option, they would be natural for terminal users I think.

Add support for pods

Currently, there is no way to tell if a container is part of a pod. It would be nice if containers were grouped by pod, or if there was a separate page (like Images and Containers) for pods. There should also be ways to interact with a pod, like starting, stopping or pausing it.

refreshing images and containers

the app isn't automatically re scanning for containers and images , if the app is open and an image is pulled from outside the app or a container is created the app won't display the changes until an action is performed inside the app or the app is restarted
a good solution will be to refresh automatically every 5 seconds (if that's not expensive in terms of resource usage) or add a refresh button .

Translations not used (?)

Hi

Is there a possibility that translations aren't actually working yet 😅 ? As you might remember I added a Dutch translation a couple of weeks ago, and updated to the latest Flatpak some days ago, but it's still defaulting to English for me. I also use other Flatpak applications such as Lollypop and these translate fine.

My active locale is nl_BE.UTF-8, which I think should fall back correctly to the nl.po, or am I missing something and does it need to be called nl_BE.po?

Thanks!

Relatively long time needed to load (images and contaiers) on startup

Not sure how much of this is Pods' fault or perhaps podman's, but I noticed that Pods takes relatively long to get the list of images and containers loaded on startup.

After start-up, it takes around ~40 seconds of the loading spinner showing before the overview is filled. I only have about 10 images and 30 containers present currently. Perhaps it is iterating each entry in the list, executing a command per item?

Would be happy to execute some raw podman commands if desired to see if that is also slow.

Reproduction steps

  • Start up the application with about 10 images and 30 containers.
  • Observe slow loading times.

Environment

  • Pods version: 1.0.0-beta.9
  • Podman version: 4.3.1

image download indicator on header bar

when the user exits the page that appears when downloading an image there is no indication that the image is downloading and no way to cancel or to know when it errors out (may happen on bad internet connections) , an indicator can be like the one in boxes (when downloading ISOs) or the one in epiphany (when downloading anything)

Automatically "follow" logs

The recently added "Logs" tab is great! Would it be possible to make it automatically refresh or "follow" the logs? Alternatively, a refresh button could also work. I can use podman-compose logs -f <container> to follow the logs, but Pods doesn't update alongside with new output; even restarting Pods doesn't make the new logs show up, it seems.

A possible problem to take into account is that these logs can be huge. I have a web application that logs database queries during a synchronization operation and a single synchronization commonly logs about 30 MB of logs. Podman probably handles most of the actual logging, but I thought it might be important whilst designing the UX/UI for it to avoid slow scrolling performance or long lines or something.

Create a symbolic seal icon

Describe your feature request

Currently, Pods shows a penguin besides the podman version in the panel status bar.

image

The icon can be found at data/resources/icons/scalable/actions/podman-symbolic.svg and should be changed to a seal resembling the original podman logo

image

No way to define command arguments when creating a container

Currently when trying to create a container there is only one field Command that sets the command executed in the container. Containers usually are created with a single startup command but sometimes when testing some things out, I found myself creating a container running sleep infinity so I can easily attach to it's filesystem and currently it's not possible.

Mention somewhere how to activate podman socket

On first run of the app the user needs to add a "Connection" but there is a lack of context about this in the UI. I had to look it up since on my system the socket wasn't activated by default:

systemctl --user start podman.socket

Return to creation wizard and restore user data on creation errors

When you try to create a new Container you're asked to provide all details like memory limits, port mapping, volumes and environmental variables etc. This is great. Then if something goes with your setup you receive an error with notification, which is what you would expect as well.

However, at this point your only option is to close the notification window and start the process all over again, which depending on complexity of your configuration might be very annoying and tedious, especially for newcomers but might also happen to more advanced user due to simple spelling errors.

I believe that the best way to handle this issue with user experience in mind is to keep all data provided by the user until operation is confirmed to be successful. Otherwise, allow user to go Back to creation wizard without losing the data they already filled in.

Removes images in use by a container without warning

In the "Images" list, there is no indication that a particular image is currently being used by a container and when deleting that image, it deletes both the image and the container using it without additional warning.

Ideally there would be either a warning like "This image is used by container X, do you really want to delete it", or there should be an indication in the list, that it is being used.

arabic translation

I'm currently working on the Arabic translations , i need to hear how your name is pronounced to be able to write it in Arabic letters

Allow searching through logs

It would be neat if there was a way to search in the "Logs" tab. If you have a lot of output, there might be something specific you're looking for. A search glass icon could do the trick, but additionally adding find-as-you-type (commonly used in GNOME applications) could also add value.

Currently you can work around this by copy-pasting the output and searching in another tool.

Translations: Add context to Podman Pods

Would be nice if the "Pods" strings making reference to the Podman feature could have a gettext context so we can set different translations for them and the app name.

Adding new translations

Hello

If I wanted to add a new translation, such as Dutch, which is not present yet, can I just translate one of the existing PO files and create a PR with the new PO file? Or will that cause problems with Weblate as they are generated? I can't seem to create a new translation for Dutch through Weblate because I do not have permissions for it.

Thanks!

I would like to translate Pods to Tamil

I would like to request to add Tamil (locale: ta) language to the Weblate component. Can you guys create it through weblate or should I submit the initial po file manually?

Only a few lines of logs are being displayed

Reproduction steps

Run container trhat produces logs, in my case it's a mountebank image.
The screenshot below shows that there are many lines of logs in the terminal, while Pods shows just a few of them:

image

Environment

  • Pods version: 1.0.2

podman API library

Currently, vv9k/podman-api-rs is being used to interface with podman. This is problematic because it targets podman version 3.4 and is missing features and fixes introduced with newer versions. For example, #127 is being blocked by a spec issue that is fixed in the latest release.

An alternative would be to generate the client code with openapi-generator. You can grab the latest spec from here and generate the client code with this command.

podman run --rm -v "${PWD}:/local:z" docker.io/openapitools/openapi-generator-cli:latest generate \
    -i /local/spec.yaml \
    -g rust \
    -o /local/gen_out \ 
   --skip-validate-spec

I can't really judge the quality of the generated code / how idiomatic it is because I'm still very new to rust.

Flathub Beta submission

Cool to see all the projects focussing on Podman. Yesterday I was checking out Podman Desktop, and to day I stumbled upon your project.

While trying it out, I was wondering if you could add your project to Flathub. Now, I understand that you don't consider your application ready for prime-time, but Flathub also has a beta-channel that might be perfect way for you to get the app in the hands of testers.

If you need any help submitting your app to Flathub, feel free to ask me for help. I maintain a multitude of packages so I'll gladly help.

List if connected service is running as root or as user

With podman one can either run podman service and container as either root or as rootless - from their own account.

Currently there is no way to easily find out which method is being used. A visual indicator to differentiate would be nice.

Coloring the headerbar like in Kings Cross Terminal would be strong and simple indictor but any indictor even if its just a tag would be welcome.

first boot splash screen

add a first boot splash screen like the ones in gnome-tour , bottles and gnome-connections
i propose 4 pages
1:welcome to pods : brief explanation to what the app does
welcome-to-pods
2: create podman containers & pods : brief explanation on what pods and containers are
create-podman-pods-and-containers
3: manage and update container images : explain what functionality the app has regarding handling images
pull-and-update-images
4: we hope you enjoy pods
we-hope-you-enjoy-pods

Panic on connection to podman dameon using TCP

Reproduction steps

  1. Expose a podman daemon using tcp
  2. Connect to that podman daemon
  3. Panic!

This is the full backtrace, which I had to compile the program myself to get:

thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', src/model/container.rs:331:47
stack backtrace:
   0: rust_begin_unwind
             at /rustc/fc594f15669680fa70d255faec3ca3fb507c3405/library/std/src/panicking.rs:575:5
   1: core::panicking::panic_fmt
             at /rustc/fc594f15669680fa70d255faec3ca3fb507c3405/library/core/src/panicking.rs:64:14
   2: core::panicking::panic
             at /rustc/fc594f15669680fa70d255faec3ca3fb507c3405/library/core/src/panicking.rs:111:5
   3: core::option::Option<T>::unwrap
             at /rustc/fc594f15669680fa70d255faec3ca3fb507c3405/library/core/src/option.rs:778:21
   4: pods::model::container::Container::new::{{closure}}
             at ./Build/pods/src/model/container.rs:331:29
   5: core::option::Option<T>::map
             at /rustc/fc594f15669680fa70d255faec3ca3fb507c3405/library/core/src/option.rs:925:29
   6: pods::model::container::Container::new
             at ./Build/pods/src/model/container.rs:324:17
   7: pods::model::container_list::ContainerList::refresh::{{closure}}::{{closure}}
             at ./Build/pods/src/model/container_list.rs:336:57
   8: core::iter::traits::iterator::Iterator::for_each::call::{{closure}}
             at /rustc/fc594f15669680fa70d255faec3ca3fb507c3405/library/core/src/iter/traits/iterator.rs:828:29
   9: core::iter::adapters::filter::filter_fold::{{closure}}
             at /rustc/fc594f15669680fa70d255faec3ca3fb507c3405/library/core/src/iter/adapters/filter.rs:37:44
  10: core::iter::traits::iterator::Iterator::fold
             at /rustc/fc594f15669680fa70d255faec3ca3fb507c3405/library/core/src/iter/traits/iterator.rs:2414:21
  11: <core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::fold
             at /rustc/fc594f15669680fa70d255faec3ca3fb507c3405/library/core/src/iter/adapters/filter.rs:101:9
  12: core::iter::traits::iterator::Iterator::for_each
             at /rustc/fc594f15669680fa70d255faec3ca3fb507c3405/library/core/src/iter/traits/iterator.rs:831:9
  13: pods::model::container_list::ContainerList::refresh::{{closure}}
             at ./Build/pods/src/model/container_list.rs:326:25
  14: pods::utils::do_async::{{closure}}
             at ./Build/pods/src/utils.rs:309:9
  15: <futures_task::future_obj::LocalFutureObj<T> as core::future::future::Future>::poll
             at ./Build/pods/_build/cargo-home/registry/src/github.com-1ecc6299db9ec823/futures-task-0.3.25/src/future_obj.rs:84:18
  16: <glib::main_context_futures::FutureWrapper as core::future::future::Future>::poll
             at ./Build/pods/_build/cargo-home/registry/src/github.com-1ecc6299db9ec823/glib-0.16.7/src/main_context_futures.rs:32:44
  17: glib::main_context_futures::TaskSource::poll::{{closure}}
             at ./Build/pods/_build/cargo-home/registry/src/github.com-1ecc6299db9ec823/glib-0.16.7/src/main_context_futures.rs:233:17
  18: glib::main_context::<impl glib::auto::main_context::MainContext>::with_thread_default
             at ./Build/pods/_build/cargo-home/registry/src/github.com-1ecc6299db9ec823/glib-0.16.7/src/main_context.rs:156:12
  19: glib::main_context_futures::TaskSource::poll
             at ./Build/pods/_build/cargo-home/registry/src/github.com-1ecc6299db9ec823/glib-0.16.7/src/main_context_futures.rs:226:9
  20: glib::main_context_futures::TaskSource::dispatch
             at ./Build/pods/_build/cargo-home/registry/src/github.com-1ecc6299db9ec823/glib-0.16.7/src/main_context_futures.rs:67:34
  21: g_main_context_dispatch
  22: <unknown>
  23: g_main_context_iteration
  24: g_application_run
  25: <O as gio::application::ApplicationExtManual>::run_with_args
             at ./Build/pods/_build/cargo-home/registry/src/github.com-1ecc6299db9ec823/gio-0.16.7/src/application.rs:35:13
  26: <O as gio::application::ApplicationExtManual>::run
             at ./Build/pods/_build/cargo-home/registry/src/github.com-1ecc6299db9ec823/gio-0.16.7/src/application.rs:28:9
  27: pods::application::Application::run
             at ./Build/pods/src/application.rs:216:9
  28: pods::main
             at ./Build/pods/src/main.rs:90:5
  29: core::ops::function::FnOnce::call_once

Environment

  • Pods version: v1.1.0-beta.1-2-g0df4289
  • Containerized via flatpak

No way to define labels when creating a pod or a container

It would be nice if there was a way to define labels on a container or a pod. I'd imagine a similar widget to the one that is responsible for adding environment variables as they both need to store a key-value pair.

I tried taking an initial stab at it by reworking the PdsEnvVarRow to be more generic PdsKeyValRow and reusing it for labels, but i think a view has to be unique to each widget, otherwise the values end up in both children that match this class.

Is creating a separate view and model for labels the way to go or is there something that would allow for a more generic view like PdsKeyValRow to be reused for both labels and environment variables?

Create a colorful graphic for an illustration placeholder page

GNOME HIG describes the concept of illustration placeholder page.

grafik

Pods is currently lacking a colorful graphics that is the prerequisite to have such an illustration placeholder page.
Thus, this issue is about to create such a colorful graphic.

Currently, the first page of Pods looks rather sad.
grafik

Personally, I like the style of GNOME Tour
grafik
grafik
grafik

Implement a central "Actions" View

Sometimes an operation may take a long time to finish (pulling large images, pruning images, etc.).
It would be helpful to gather all user initiated action in a central place, preferably in a menu button's popover inside the header bar.

the app icon

the new app icon doesn't fit in the gnome design guidelines in many ways , it's way too cluttered and the highlights are too bright while the shadows are very dark making it look even more busy , and to make the matters worse the symbolic reintroduces the blurry anti aliasing issue and uses semi transparent pixels which is against the guidelines of gnome symbolic icons

Segmentation fault when entering and exiting container details view

If I enter and exit the details view of a container a few times, I can seemingly randomly trigger a segfault.

(process:20): Gdk-DEBUG: 14:02:55.565: Ignoring portal setting for org.gnome.desktop.wm.preferences auto-raise-delay
(process:20): Gdk-DEBUG: 14:02:55.565: Ignoring portal setting for org.gnome.desktop.wm.preferences audible-bell
(process:20): Gdk-DEBUG: 14:02:55.565: Ignoring portal setting for org.gnome.desktop.wm.preferences visual-bell
(process:20): Gdk-DEBUG: 14:02:55.565: Using portal setting for org.gnome.fontconfig serial: 0

(process:20): GLib-GIO-DEBUG: 14:02:55.610: _g_io_module_get_default: Found default implementation gvfs (GDaemonVfs) for ‘gio-vfs’
(process:20): Adwaita-DEBUG: 14:02:55.649: Setting org.gnome.desktop.interface.a11y.high-contrast of type b not found
(pods:20): GLib-GIO-DEBUG: 14:02:55.702: _g_io_module_get_default: Found default implementation keyfile (GKeyfileSettingsBackend) for ‘gsettings-backend’

(pods:20): Gtk-CRITICAL **: 14:02:56.531: Unable to connect to the accessibility bus at 'unix:abstract=00008': Could not connect: Connection refused
(pods:20): glib-rs-clone-DEBUG: 14:03:11.093: Failed to upgrade obj
Thread 1 "pods" received signal SIGSEGV, Segmentation fault.
> bt
#0  0x00007ffff7226b6a in g_type_check_instance_cast () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#1  0x00007ffff7ef7bc8 in check_window_width () at /usr/lib/x86_64-linux-gnu/libadwaita-1.so.0
#2  0x00007ffff7106ceb in g_main_context_dispatch () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#3  0x00007ffff71071f8 in g_main_context_iterate.constprop () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#4  0x00007ffff71072c4 in g_main_context_iteration () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#5  0x00007ffff7344c0d in g_application_run () at /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0
#6  0x000055555565ecf3 in gio::application::{impl#0}::run_with_args<pods::application::Application, alloc::string::String> (self=0x7fffffffe220, args=...) at /home/jakob/projects/symphony/_build/cargo-home/registry/src/github.com-1ecc6299db9ec823/gio-0.15.10/src/application.rs:30
#7  0x000055555565eb66 in gio::application::{impl#0}::run<pods::application::Application> (self=0x7fffffffe220) at /home/jakob/projects/symphony/_build/cargo-home/registry/src/github.com-1ecc6299db9ec823/gio-0.15.10/src/application.rs:23
#8  0x000055555565e094 in pods::application::Application::run (self=0x7fffffffe220) at src/application.rs:219
#9  0x0000555555977548 in pods::main () at src/main.rs:79

Pods revision 6748af3

Please let me know if I can provide more information.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.