Files
2026-07-23 18:10:47 -07:00

120 lines
6.0 KiB
HTML

---
title: Application Compatibility
layout: base
permalink: /application-compatibility/
---
<div class="container">
<div class="users-content">
<h1>gVisor Application Compatibility</h1>
<style>
.app-item {
border-bottom: 1px solid #eee;
margin-bottom: 20px;
padding-bottom: 20px;
}
/* The last visible app in a category has no separator. :last-child covers
the static render; .app-item--last is set by the search filter to the
last still-visible row. */
.app-item:last-child,
.app-item.app-item--last {
border-bottom: none;
padding-bottom: 0;
}
</style>
{% assign apps = site.data['application-compatibility'].apps %}
<p style="font-size: 16px; line-height: 1.6; margin-top: 20px;">
Compatibility issues while running applications in gVisor are rare; a large majority of workloads, including those not listed on this page, will "just work."
<br>
Below is a small (but growing) sample of applications that are known to work in gVisor.
This is a <b>best-effort</b> list, not a guarantee that applications marked "Compatible" are fully functional.
If you notice an issue, contributions to this list are welcome! Please open a pull request on <a href="https://github.com/google/gvisor">GitHub</a>.
</p>
<div style="margin-top: 30px;">
<input
type="search"
id="app-search"
placeholder="Search applications…"
aria-label="Search applications"
autocomplete="off"
style="width: 100%; box-sizing: border-box; padding: 12px 16px; font-size: 16px; border: 1px solid #d1d9e0; border-radius: 8px; outline: none;"
/>
</div>
{% assign cat_groups = apps | group_by: "category" | sort: "name" %}
<div id="app-list" style="margin-top: 25px; margin-bottom: 60px;">
<p id="app-search-noresults" style="display: none; color: #64748b; font-size: 16px; padding: 20px 0;">No applications match your search.</p>
{% for cat in cat_groups %}
<div class="panel panel-default category-panel" style="border-radius: 4px; margin-bottom: 25px;">
<div class="panel-heading" style="padding: 15px 20px; background-color: #fff;">
<h2 style="font-size: 20px; font-weight: bold; color: #333; margin: 0;">{{ cat.name }}</h2>
</div>
<div class="panel-body" style="background-color: #fcfcfc; padding: 25px 25px 5px 25px; border-top: 1px solid #eee;">
{% assign sorted_items = cat.items | sort_natural: "name" %}
{% for item in sorted_items %}
<div class="app-item" data-name="{{ item.name | downcase | escape }}">
<div style="display: flex; justify-content: space-between; align-items: baseline; flex-wrap: wrap;">
<div style="display: flex; align-items: baseline; flex-wrap: wrap;">
<span style="font-size: 18px; font-weight: 600; margin-right: 12px; color: #1a202c;">{{ item.name }}</span>
<span style="font-size: 13px; color: #94a3b8;">{% if item.version and item.version != '' %}Latest version tested: {{ item.version }}{% endif %}{% if item.version and item.version != '' and item.test_source and item.test_source != '' %}. {% endif %}{% if item.test_source and item.test_source != '' %}<a href="https://github.com/google/gvisor/blob/master/{{ item.test_source }}" target="_blank" rel="noopener" style="color: #94a3b8; text-decoration: underline;">Testing methodology</a>{% endif %}</span>
</div>
<div>
{% case item.verdict %}
{% when 'yes' %}
<span class="label label-success" style="padding: 6px 12px; font-size: 13px; border-radius: 12px;">Compatible</span>
{% when 'partial' %}
<span class="label label-warning" style="padding: 6px 12px; font-size: 13px; border-radius: 12px;">Partial</span>
{% when 'experimental' %}
<span class="label label-primary" style="padding: 6px 12px; font-size: 13px; border-radius: 12px;">Experimental</span>
{% when 'coming-soon' %}
<span class="label label-info" style="padding: 6px 12px; font-size: 13px; border-radius: 12px;">Coming Soon</span>
{% when 'no' %}
<span class="label label-danger" style="padding: 6px 12px; font-size: 13px; border-radius: 12px;">Not compatible</span>
{% endcase %}
</div>
</div>
{% if item.notes and item.notes != '' %}
<p style="color: #555; font-size: 14px; line-height: 1.6; margin: 10px 0 0 0;"><strong>Notes:</strong> {{ item.notes | markdownify | remove: '<p>' | remove: '</p>' | strip }}</p>
{% endif %}
</div>
{% endfor %}
</div>
</div>
{% endfor %}
</div>
<script>
(function () {
var input = document.getElementById('app-search');
if (!input) return;
var panels = document.querySelectorAll('#app-list .category-panel');
var noResults = document.getElementById('app-search-noresults');
function applyFilter() {
var q = input.value.trim().toLowerCase();
var anyVisible = false;
panels.forEach(function (panel) {
var lastVisible = null;
panel.querySelectorAll('.app-item').forEach(function (item) {
var match = q === '' || (item.getAttribute('data-name') || '').indexOf(q) !== -1;
item.style.display = match ? '' : 'none';
item.classList.remove('app-item--last');
if (match) lastVisible = item;
});
if (lastVisible) lastVisible.classList.add('app-item--last');
panel.style.display = lastVisible ? '' : 'none';
if (lastVisible) anyVisible = true;
});
if (noResults) noResults.style.display = anyVisible ? 'none' : '';
}
input.addEventListener('input', applyFilter);
})();
</script>
</div> <!-- end users-content -->
</div> <!-- end container -->