Skip to content

Compose functionality using familiar docker-compose syntax for container - #398

Closed
mazdak wants to merge 3 commits into
apple:mainfrom
mazdak:mazdak/container-compose
Closed

Compose functionality using familiar docker-compose syntax for container#398
mazdak wants to merge 3 commits into
apple:mainfrom
mazdak:mazdak/container-compose

Conversation

@mazdak

@mazdakmazdak commented Jul 30, 2025

Copy link
Copy Markdown
Contributor

Motivation

This branch started from a practical goal: run a real Docker Compose development stack on top of Apple's container tooling.

The immediate workload that drove the implementation was our main repo with contains a fairly normal, but above average complexity compose.yaml file, which relies on normal Compose features such as multi-service orchestration, depends_on, health checks, env_file, profile selection, bind mounts, named volumes, extra_hosts, and image build-or-reuse behavior.

container did not have a Compose-compatible plugin for that workflow, so bringing up a realistic stack required a new plugin layer that can translate Compose concepts into the existing container runtime model.

Scope

This PR adds a first-party container compose plugin that implements the Compose-style orchestration layer in Plugins/container-compose.

It is stacked on top of #1340 because Compose extra_hosts needs the core hosts plumbing introduced there, as well as #1341.

What this changes

  • add the Plugins/container-compose package, plugin config, CLI entrypoints, and debug executable
  • add compose parsing, file merging, include support, env interpolation, project conversion, orchestration, and package-local test coverage
  • implement Compose extra_hosts, health checks, dependency ordering, project naming/path resolution, volume copy-up behavior, and image reuse in the plugin layer

@jglogan

Copy link
Copy Markdown
Contributor

Hi @mazdak, thanks for the PR!

Please read the PR discussion for #239. It describes the approach you'll need to take to build out a compose plugin.

The other approach would be to create a standalone CLI plugin in a Github project that you host and create a signed installer that puts your plugin under the user-installed plugins directory at /usr/local/libexec/container-plugins.

@mazdak

Copy link
Copy Markdown
ContributorAuthor

Hi @mazdak, thanks for the PR!

Please read the PR discussion for #239. It describes the approach you'll need to take to build out a compose plugin.

The other approach would be to create a standalone CLI plugin in a Github project that you host and create a signed installer that puts your plugin under the user-installed plugins directory at /usr/local/libexec/container-plugins.

Sounds good. I will take a crack at that.

@jglogan

Copy link
Copy Markdown
Contributor

Sounds good. I will take a crack at that.

Cool! We here to help either way. If you want to try creating a standalone plugin, open up a discussion and drop a link to it here. We (maintainers at Apple) can't work directly on other repos but we should be able to answer questions in the discussion.

If you're looking at breaking this PR down into a minimally functional plugin as discussed over in the other PR, by all means continue here.

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 2153eed to 6660fe6CompareJuly 30, 2025 21:05
@mazdak

Copy link
Copy Markdown
ContributorAuthor

Sounds good. I will take a crack at that.

Cool! We here to help either way. If you want to try creating a standalone plugin, open up a discussion and drop a link to it here. We (maintainers at Apple) can't work directly on other repos but we should be able to answer questions in the discussion.

If you're looking at breaking this PR down into a minimally functional plugin as discussed over in the other PR, by all means continue here.

I will say that this PR is 99.9% self contained. Everything Compose related is in its own directory, and tested. Only one change was made to Application to amend the compose cli to the list.

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from d7cedc6 to 2909e02CompareJuly 31, 2025 19:05
@jglogan

Copy link
Copy Markdown
Contributor

I will say that this PR is 99.9% self contained. Everything Compose related is in its own directory, and tested. Only one change was made to Application to amend the compose cli to the list.

The other PR is more self-contained; it doesn't hardwire the command into Application.

Self-contained is not the same as "minimally functional". The justification for starting with a "minimally functional" PR and building with PRs for discrete features is over in the other compose PR discussion.

@mazdak

Copy link
Copy Markdown
ContributorAuthor

I will say that this PR is 99.9% self contained. Everything Compose related is in its own directory, and tested. Only one change was made to Application to amend the compose cli to the list.

The other PR is more self-contained; it doesn't hardwire the command into Application.

Self-contained is not the same as "minimally functional". The justification for starting with a "minimally functional" PR and building with PRs for discrete features is over in the other compose PR discussion.

I have refactored this PR to use the plugin architecture

@mazdak
mazdakforce-pushed the mazdak/container-compose branch 3 times, most recently from b25f0b6 to 294f236CompareAugust 9, 2025 12:20
@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 289dbe9 to 910e005CompareAugust 19, 2025 15:58
@mazdak
mazdakforce-pushed the mazdak/container-compose branch 9 times, most recently from 8a9d2fd to 645301bCompareSeptember 3, 2025 15:11
@Mcrich23

Copy link
Copy Markdown
Contributor

Hey! So sorry, but in an effort to make plugin development more possible #603 and #635 have lead to the CLI folder being renamed to ContainerCommands and that will impact the merging of your pull request. Just an FYI, so you understand the issue when you are resolving conflicts.

Also, idk if you are using the existing commands at all for your implementation, but if you are #603 exposes all cli commands as structures for other targets, so you can use them without touching the shell environment.

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 84c62a1 to 7466a97CompareSeptember 21, 2025 21:04
@Mcrich23

Copy link
Copy Markdown
Contributor

Quick question @mazdak, does this implementation support anonymous volumes?

Just trying to figure some things out...

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from e79de20 to 46d43ccCompareMarch 22, 2026 17:07
@mazdakmazdak changed the title Apple Container's implementation of compose functionality using familiar docker-compose YAML syntax.Compose functionality using familiar docker-compose syntax for containerMar 22, 2026
@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 46d43cc to 4f8ac5cCompareMarch 22, 2026 20:24
@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 4f8ac5c to 4acd6f4CompareMarch 22, 2026 20:26
@mazdak

Copy link
Copy Markdown
ContributorAuthor

Quick question @mazdak, does this implementation support anonymous volumes?

Just trying to figure some things out...

Yes, with one important caveat.

What it supports:

  • Short-form anonymous volumes like - /data
  • Long-form anonymous volumes like:
 - type: volume
target: /cache

The caveat:

  • They are not truly Docker-style random anonymous volumes.
  • This implementation gives them deterministic generated names based on project + service + target
  • So in practice they behave more like hidden auto-generated named volumes and will be reused for the same service/target across later up runs.
  • They are cleaned up on down -v via the anonymous-volume label path

@mazdak

Copy link
Copy Markdown
ContributorAuthor

This implementation has been modernized and work on real docker-compose payloads in our repository.

@jglogan

Copy link
Copy Markdown
Contributor

Closing for now, as we're not considering compose for upstream at this time. Please develop this as an external plugin for now. If you have any questions regarding plugin development (we're still getting docs together) feel free to open a discussion topic!

@jgloganjglogan closed this Apr 6, 2026

@vxnkjyffmq-codevxnkjyffmq-code left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay I approve

@vxnkjyffmq-codevxnkjyffmq-code left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I apolog

@vxnkjyffmq-codevxnkjyffmq-code left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🕺🏼🎆

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@mazdak@jglogan@Mcrich23@vxnkjyffmq-code@adeebashraf
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Compose functionality using familiar docker-compose syntax for container by mazdak · Pull Request #398 · apple/container · GitHub
Skip to content

Compose functionality using familiar docker-compose syntax for container - #398

Closed
mazdak wants to merge 3 commits into
apple:mainfrom
mazdak:mazdak/container-compose
Closed

Compose functionality using familiar docker-compose syntax for container#398
mazdak wants to merge 3 commits into
apple:mainfrom
mazdak:mazdak/container-compose

Conversation

@mazdak

@mazdakmazdak commented Jul 30, 2025

Copy link
Copy Markdown
Contributor

Motivation

This branch started from a practical goal: run a real Docker Compose development stack on top of Apple's container tooling.

The immediate workload that drove the implementation was our main repo with contains a fairly normal, but above average complexity compose.yaml file, which relies on normal Compose features such as multi-service orchestration, depends_on, health checks, env_file, profile selection, bind mounts, named volumes, extra_hosts, and image build-or-reuse behavior.

container did not have a Compose-compatible plugin for that workflow, so bringing up a realistic stack required a new plugin layer that can translate Compose concepts into the existing container runtime model.

Scope

This PR adds a first-party container compose plugin that implements the Compose-style orchestration layer in Plugins/container-compose.

It is stacked on top of #1340 because Compose extra_hosts needs the core hosts plumbing introduced there, as well as #1341.

What this changes

  • add the Plugins/container-compose package, plugin config, CLI entrypoints, and debug executable
  • add compose parsing, file merging, include support, env interpolation, project conversion, orchestration, and package-local test coverage
  • implement Compose extra_hosts, health checks, dependency ordering, project naming/path resolution, volume copy-up behavior, and image reuse in the plugin layer

@jglogan

Copy link
Copy Markdown
Contributor

Hi @mazdak, thanks for the PR!

Please read the PR discussion for #239. It describes the approach you'll need to take to build out a compose plugin.

The other approach would be to create a standalone CLI plugin in a Github project that you host and create a signed installer that puts your plugin under the user-installed plugins directory at /usr/local/libexec/container-plugins.

@mazdak

Copy link
Copy Markdown
ContributorAuthor

Hi @mazdak, thanks for the PR!

Please read the PR discussion for #239. It describes the approach you'll need to take to build out a compose plugin.

The other approach would be to create a standalone CLI plugin in a Github project that you host and create a signed installer that puts your plugin under the user-installed plugins directory at /usr/local/libexec/container-plugins.

Sounds good. I will take a crack at that.

@jglogan

Copy link
Copy Markdown
Contributor

Sounds good. I will take a crack at that.

Cool! We here to help either way. If you want to try creating a standalone plugin, open up a discussion and drop a link to it here. We (maintainers at Apple) can't work directly on other repos but we should be able to answer questions in the discussion.

If you're looking at breaking this PR down into a minimally functional plugin as discussed over in the other PR, by all means continue here.

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 2153eed to 6660fe6CompareJuly 30, 2025 21:05
@mazdak

Copy link
Copy Markdown
ContributorAuthor

Sounds good. I will take a crack at that.

Cool! We here to help either way. If you want to try creating a standalone plugin, open up a discussion and drop a link to it here. We (maintainers at Apple) can't work directly on other repos but we should be able to answer questions in the discussion.

If you're looking at breaking this PR down into a minimally functional plugin as discussed over in the other PR, by all means continue here.

I will say that this PR is 99.9% self contained. Everything Compose related is in its own directory, and tested. Only one change was made to Application to amend the compose cli to the list.

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from d7cedc6 to 2909e02CompareJuly 31, 2025 19:05
@jglogan

Copy link
Copy Markdown
Contributor

I will say that this PR is 99.9% self contained. Everything Compose related is in its own directory, and tested. Only one change was made to Application to amend the compose cli to the list.

The other PR is more self-contained; it doesn't hardwire the command into Application.

Self-contained is not the same as "minimally functional". The justification for starting with a "minimally functional" PR and building with PRs for discrete features is over in the other compose PR discussion.

@mazdak

Copy link
Copy Markdown
ContributorAuthor

I will say that this PR is 99.9% self contained. Everything Compose related is in its own directory, and tested. Only one change was made to Application to amend the compose cli to the list.

The other PR is more self-contained; it doesn't hardwire the command into Application.

Self-contained is not the same as "minimally functional". The justification for starting with a "minimally functional" PR and building with PRs for discrete features is over in the other compose PR discussion.

I have refactored this PR to use the plugin architecture

@mazdak
mazdakforce-pushed the mazdak/container-compose branch 3 times, most recently from b25f0b6 to 294f236CompareAugust 9, 2025 12:20
@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 289dbe9 to 910e005CompareAugust 19, 2025 15:58
@mazdak
mazdakforce-pushed the mazdak/container-compose branch 9 times, most recently from 8a9d2fd to 645301bCompareSeptember 3, 2025 15:11
@Mcrich23

Copy link
Copy Markdown
Contributor

Hey! So sorry, but in an effort to make plugin development more possible #603 and #635 have lead to the CLI folder being renamed to ContainerCommands and that will impact the merging of your pull request. Just an FYI, so you understand the issue when you are resolving conflicts.

Also, idk if you are using the existing commands at all for your implementation, but if you are #603 exposes all cli commands as structures for other targets, so you can use them without touching the shell environment.

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 84c62a1 to 7466a97CompareSeptember 21, 2025 21:04
@Mcrich23

Copy link
Copy Markdown
Contributor

Quick question @mazdak, does this implementation support anonymous volumes?

Just trying to figure some things out...

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from e79de20 to 46d43ccCompareMarch 22, 2026 17:07
@mazdakmazdak changed the title Apple Container's implementation of compose functionality using familiar docker-compose YAML syntax.Compose functionality using familiar docker-compose syntax for containerMar 22, 2026
@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 46d43cc to 4f8ac5cCompareMarch 22, 2026 20:24
@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 4f8ac5c to 4acd6f4CompareMarch 22, 2026 20:26
@mazdak

Copy link
Copy Markdown
ContributorAuthor

Quick question @mazdak, does this implementation support anonymous volumes?

Just trying to figure some things out...

Yes, with one important caveat.

What it supports:

  • Short-form anonymous volumes like - /data
  • Long-form anonymous volumes like:
 - type: volume
target: /cache

The caveat:

  • They are not truly Docker-style random anonymous volumes.
  • This implementation gives them deterministic generated names based on project + service + target
  • So in practice they behave more like hidden auto-generated named volumes and will be reused for the same service/target across later up runs.
  • They are cleaned up on down -v via the anonymous-volume label path

@mazdak

Copy link
Copy Markdown
ContributorAuthor

This implementation has been modernized and work on real docker-compose payloads in our repository.

@jglogan

Copy link
Copy Markdown
Contributor

Closing for now, as we're not considering compose for upstream at this time. Please develop this as an external plugin for now. If you have any questions regarding plugin development (we're still getting docs together) feel free to open a discussion topic!

@jgloganjglogan closed this Apr 6, 2026

@vxnkjyffmq-codevxnkjyffmq-code left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay I approve

@vxnkjyffmq-codevxnkjyffmq-code left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I apolog

@vxnkjyffmq-codevxnkjyffmq-code left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🕺🏼🎆

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@mazdak@jglogan@Mcrich23@vxnkjyffmq-code@adeebashraf
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Compose functionality using familiar docker-compose syntax for container by mazdak · Pull Request #398 · apple/container · GitHub
Skip to content

Compose functionality using familiar docker-compose syntax for container - #398

Closed
mazdak wants to merge 3 commits into
apple:mainfrom
mazdak:mazdak/container-compose
Closed

Compose functionality using familiar docker-compose syntax for container#398
mazdak wants to merge 3 commits into
apple:mainfrom
mazdak:mazdak/container-compose

Conversation

@mazdak

@mazdakmazdak commented Jul 30, 2025

Copy link
Copy Markdown
Contributor

Motivation

This branch started from a practical goal: run a real Docker Compose development stack on top of Apple's container tooling.

The immediate workload that drove the implementation was our main repo with contains a fairly normal, but above average complexity compose.yaml file, which relies on normal Compose features such as multi-service orchestration, depends_on, health checks, env_file, profile selection, bind mounts, named volumes, extra_hosts, and image build-or-reuse behavior.

container did not have a Compose-compatible plugin for that workflow, so bringing up a realistic stack required a new plugin layer that can translate Compose concepts into the existing container runtime model.

Scope

This PR adds a first-party container compose plugin that implements the Compose-style orchestration layer in Plugins/container-compose.

It is stacked on top of #1340 because Compose extra_hosts needs the core hosts plumbing introduced there, as well as #1341.

What this changes

  • add the Plugins/container-compose package, plugin config, CLI entrypoints, and debug executable
  • add compose parsing, file merging, include support, env interpolation, project conversion, orchestration, and package-local test coverage
  • implement Compose extra_hosts, health checks, dependency ordering, project naming/path resolution, volume copy-up behavior, and image reuse in the plugin layer

@jglogan

Copy link
Copy Markdown
Contributor

Hi @mazdak, thanks for the PR!

Please read the PR discussion for #239. It describes the approach you'll need to take to build out a compose plugin.

The other approach would be to create a standalone CLI plugin in a Github project that you host and create a signed installer that puts your plugin under the user-installed plugins directory at /usr/local/libexec/container-plugins.

@mazdak

Copy link
Copy Markdown
ContributorAuthor

Hi @mazdak, thanks for the PR!

Please read the PR discussion for #239. It describes the approach you'll need to take to build out a compose plugin.

The other approach would be to create a standalone CLI plugin in a Github project that you host and create a signed installer that puts your plugin under the user-installed plugins directory at /usr/local/libexec/container-plugins.

Sounds good. I will take a crack at that.

@jglogan

Copy link
Copy Markdown
Contributor

Sounds good. I will take a crack at that.

Cool! We here to help either way. If you want to try creating a standalone plugin, open up a discussion and drop a link to it here. We (maintainers at Apple) can't work directly on other repos but we should be able to answer questions in the discussion.

If you're looking at breaking this PR down into a minimally functional plugin as discussed over in the other PR, by all means continue here.

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 2153eed to 6660fe6CompareJuly 30, 2025 21:05
@mazdak

Copy link
Copy Markdown
ContributorAuthor

Sounds good. I will take a crack at that.

Cool! We here to help either way. If you want to try creating a standalone plugin, open up a discussion and drop a link to it here. We (maintainers at Apple) can't work directly on other repos but we should be able to answer questions in the discussion.

If you're looking at breaking this PR down into a minimally functional plugin as discussed over in the other PR, by all means continue here.

I will say that this PR is 99.9% self contained. Everything Compose related is in its own directory, and tested. Only one change was made to Application to amend the compose cli to the list.

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from d7cedc6 to 2909e02CompareJuly 31, 2025 19:05
@jglogan

Copy link
Copy Markdown
Contributor

I will say that this PR is 99.9% self contained. Everything Compose related is in its own directory, and tested. Only one change was made to Application to amend the compose cli to the list.

The other PR is more self-contained; it doesn't hardwire the command into Application.

Self-contained is not the same as "minimally functional". The justification for starting with a "minimally functional" PR and building with PRs for discrete features is over in the other compose PR discussion.

@mazdak

Copy link
Copy Markdown
ContributorAuthor

I will say that this PR is 99.9% self contained. Everything Compose related is in its own directory, and tested. Only one change was made to Application to amend the compose cli to the list.

The other PR is more self-contained; it doesn't hardwire the command into Application.

Self-contained is not the same as "minimally functional". The justification for starting with a "minimally functional" PR and building with PRs for discrete features is over in the other compose PR discussion.

I have refactored this PR to use the plugin architecture

@mazdak
mazdakforce-pushed the mazdak/container-compose branch 3 times, most recently from b25f0b6 to 294f236CompareAugust 9, 2025 12:20
@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 289dbe9 to 910e005CompareAugust 19, 2025 15:58
@mazdak
mazdakforce-pushed the mazdak/container-compose branch 9 times, most recently from 8a9d2fd to 645301bCompareSeptember 3, 2025 15:11
@Mcrich23

Copy link
Copy Markdown
Contributor

Hey! So sorry, but in an effort to make plugin development more possible #603 and #635 have lead to the CLI folder being renamed to ContainerCommands and that will impact the merging of your pull request. Just an FYI, so you understand the issue when you are resolving conflicts.

Also, idk if you are using the existing commands at all for your implementation, but if you are #603 exposes all cli commands as structures for other targets, so you can use them without touching the shell environment.

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 84c62a1 to 7466a97CompareSeptember 21, 2025 21:04
@Mcrich23

Copy link
Copy Markdown
Contributor

Quick question @mazdak, does this implementation support anonymous volumes?

Just trying to figure some things out...

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from e79de20 to 46d43ccCompareMarch 22, 2026 17:07
@mazdakmazdak changed the title Apple Container's implementation of compose functionality using familiar docker-compose YAML syntax.Compose functionality using familiar docker-compose syntax for containerMar 22, 2026
@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 46d43cc to 4f8ac5cCompareMarch 22, 2026 20:24
@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 4f8ac5c to 4acd6f4CompareMarch 22, 2026 20:26
@mazdak

Copy link
Copy Markdown
ContributorAuthor

Quick question @mazdak, does this implementation support anonymous volumes?

Just trying to figure some things out...

Yes, with one important caveat.

What it supports:

  • Short-form anonymous volumes like - /data
  • Long-form anonymous volumes like:
 - type: volume
target: /cache

The caveat:

  • They are not truly Docker-style random anonymous volumes.
  • This implementation gives them deterministic generated names based on project + service + target
  • So in practice they behave more like hidden auto-generated named volumes and will be reused for the same service/target across later up runs.
  • They are cleaned up on down -v via the anonymous-volume label path

@mazdak

Copy link
Copy Markdown
ContributorAuthor

This implementation has been modernized and work on real docker-compose payloads in our repository.

@jglogan

Copy link
Copy Markdown
Contributor

Closing for now, as we're not considering compose for upstream at this time. Please develop this as an external plugin for now. If you have any questions regarding plugin development (we're still getting docs together) feel free to open a discussion topic!

@jgloganjglogan closed this Apr 6, 2026

@vxnkjyffmq-codevxnkjyffmq-code left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay I approve

@vxnkjyffmq-codevxnkjyffmq-code left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I apolog

@vxnkjyffmq-codevxnkjyffmq-code left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🕺🏼🎆

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@mazdak@jglogan@Mcrich23@vxnkjyffmq-code@adeebashraf
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Compose functionality using familiar docker-compose syntax for container by mazdak · Pull Request #398 · apple/container · GitHub
Skip to content

Compose functionality using familiar docker-compose syntax for container - #398

Closed
mazdak wants to merge 3 commits into
apple:mainfrom
mazdak:mazdak/container-compose
Closed

Compose functionality using familiar docker-compose syntax for container#398
mazdak wants to merge 3 commits into
apple:mainfrom
mazdak:mazdak/container-compose

Conversation

@mazdak

@mazdakmazdak commented Jul 30, 2025

Copy link
Copy Markdown
Contributor

Motivation

This branch started from a practical goal: run a real Docker Compose development stack on top of Apple's container tooling.

The immediate workload that drove the implementation was our main repo with contains a fairly normal, but above average complexity compose.yaml file, which relies on normal Compose features such as multi-service orchestration, depends_on, health checks, env_file, profile selection, bind mounts, named volumes, extra_hosts, and image build-or-reuse behavior.

container did not have a Compose-compatible plugin for that workflow, so bringing up a realistic stack required a new plugin layer that can translate Compose concepts into the existing container runtime model.

Scope

This PR adds a first-party container compose plugin that implements the Compose-style orchestration layer in Plugins/container-compose.

It is stacked on top of #1340 because Compose extra_hosts needs the core hosts plumbing introduced there, as well as #1341.

What this changes

  • add the Plugins/container-compose package, plugin config, CLI entrypoints, and debug executable
  • add compose parsing, file merging, include support, env interpolation, project conversion, orchestration, and package-local test coverage
  • implement Compose extra_hosts, health checks, dependency ordering, project naming/path resolution, volume copy-up behavior, and image reuse in the plugin layer

@jglogan

Copy link
Copy Markdown
Contributor

Hi @mazdak, thanks for the PR!

Please read the PR discussion for #239. It describes the approach you'll need to take to build out a compose plugin.

The other approach would be to create a standalone CLI plugin in a Github project that you host and create a signed installer that puts your plugin under the user-installed plugins directory at /usr/local/libexec/container-plugins.

@mazdak

Copy link
Copy Markdown
ContributorAuthor

Hi @mazdak, thanks for the PR!

Please read the PR discussion for #239. It describes the approach you'll need to take to build out a compose plugin.

The other approach would be to create a standalone CLI plugin in a Github project that you host and create a signed installer that puts your plugin under the user-installed plugins directory at /usr/local/libexec/container-plugins.

Sounds good. I will take a crack at that.

@jglogan

Copy link
Copy Markdown
Contributor

Sounds good. I will take a crack at that.

Cool! We here to help either way. If you want to try creating a standalone plugin, open up a discussion and drop a link to it here. We (maintainers at Apple) can't work directly on other repos but we should be able to answer questions in the discussion.

If you're looking at breaking this PR down into a minimally functional plugin as discussed over in the other PR, by all means continue here.

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 2153eed to 6660fe6CompareJuly 30, 2025 21:05
@mazdak

Copy link
Copy Markdown
ContributorAuthor

Sounds good. I will take a crack at that.

Cool! We here to help either way. If you want to try creating a standalone plugin, open up a discussion and drop a link to it here. We (maintainers at Apple) can't work directly on other repos but we should be able to answer questions in the discussion.

If you're looking at breaking this PR down into a minimally functional plugin as discussed over in the other PR, by all means continue here.

I will say that this PR is 99.9% self contained. Everything Compose related is in its own directory, and tested. Only one change was made to Application to amend the compose cli to the list.

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from d7cedc6 to 2909e02CompareJuly 31, 2025 19:05
@jglogan

Copy link
Copy Markdown
Contributor

I will say that this PR is 99.9% self contained. Everything Compose related is in its own directory, and tested. Only one change was made to Application to amend the compose cli to the list.

The other PR is more self-contained; it doesn't hardwire the command into Application.

Self-contained is not the same as "minimally functional". The justification for starting with a "minimally functional" PR and building with PRs for discrete features is over in the other compose PR discussion.

@mazdak

Copy link
Copy Markdown
ContributorAuthor

I will say that this PR is 99.9% self contained. Everything Compose related is in its own directory, and tested. Only one change was made to Application to amend the compose cli to the list.

The other PR is more self-contained; it doesn't hardwire the command into Application.

Self-contained is not the same as "minimally functional". The justification for starting with a "minimally functional" PR and building with PRs for discrete features is over in the other compose PR discussion.

I have refactored this PR to use the plugin architecture

@mazdak
mazdakforce-pushed the mazdak/container-compose branch 3 times, most recently from b25f0b6 to 294f236CompareAugust 9, 2025 12:20
@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 289dbe9 to 910e005CompareAugust 19, 2025 15:58
@mazdak
mazdakforce-pushed the mazdak/container-compose branch 9 times, most recently from 8a9d2fd to 645301bCompareSeptember 3, 2025 15:11
@Mcrich23

Copy link
Copy Markdown
Contributor

Hey! So sorry, but in an effort to make plugin development more possible #603 and #635 have lead to the CLI folder being renamed to ContainerCommands and that will impact the merging of your pull request. Just an FYI, so you understand the issue when you are resolving conflicts.

Also, idk if you are using the existing commands at all for your implementation, but if you are #603 exposes all cli commands as structures for other targets, so you can use them without touching the shell environment.

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 84c62a1 to 7466a97CompareSeptember 21, 2025 21:04
@Mcrich23

Copy link
Copy Markdown
Contributor

Quick question @mazdak, does this implementation support anonymous volumes?

Just trying to figure some things out...

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from e79de20 to 46d43ccCompareMarch 22, 2026 17:07
@mazdakmazdak changed the title Apple Container's implementation of compose functionality using familiar docker-compose YAML syntax.Compose functionality using familiar docker-compose syntax for containerMar 22, 2026
@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 46d43cc to 4f8ac5cCompareMarch 22, 2026 20:24
@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 4f8ac5c to 4acd6f4CompareMarch 22, 2026 20:26
@mazdak

Copy link
Copy Markdown
ContributorAuthor

Quick question @mazdak, does this implementation support anonymous volumes?

Just trying to figure some things out...

Yes, with one important caveat.

What it supports:

  • Short-form anonymous volumes like - /data
  • Long-form anonymous volumes like:
 - type: volume
target: /cache

The caveat:

  • They are not truly Docker-style random anonymous volumes.
  • This implementation gives them deterministic generated names based on project + service + target
  • So in practice they behave more like hidden auto-generated named volumes and will be reused for the same service/target across later up runs.
  • They are cleaned up on down -v via the anonymous-volume label path

@mazdak

Copy link
Copy Markdown
ContributorAuthor

This implementation has been modernized and work on real docker-compose payloads in our repository.

@jglogan

Copy link
Copy Markdown
Contributor

Closing for now, as we're not considering compose for upstream at this time. Please develop this as an external plugin for now. If you have any questions regarding plugin development (we're still getting docs together) feel free to open a discussion topic!

@jgloganjglogan closed this Apr 6, 2026

@vxnkjyffmq-codevxnkjyffmq-code left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay I approve

@vxnkjyffmq-codevxnkjyffmq-code left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I apolog

@vxnkjyffmq-codevxnkjyffmq-code left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🕺🏼🎆

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@mazdak@jglogan@Mcrich23@vxnkjyffmq-code@adeebashraf
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Compose functionality using familiar docker-compose syntax for container by mazdak · Pull Request #398 · apple/container · GitHub
Skip to content

Compose functionality using familiar docker-compose syntax for container - #398

Closed
mazdak wants to merge 3 commits into
apple:mainfrom
mazdak:mazdak/container-compose
Closed

Compose functionality using familiar docker-compose syntax for container#398
mazdak wants to merge 3 commits into
apple:mainfrom
mazdak:mazdak/container-compose

Conversation

@mazdak

@mazdakmazdak commented Jul 30, 2025

Copy link
Copy Markdown
Contributor

Motivation

This branch started from a practical goal: run a real Docker Compose development stack on top of Apple's container tooling.

The immediate workload that drove the implementation was our main repo with contains a fairly normal, but above average complexity compose.yaml file, which relies on normal Compose features such as multi-service orchestration, depends_on, health checks, env_file, profile selection, bind mounts, named volumes, extra_hosts, and image build-or-reuse behavior.

container did not have a Compose-compatible plugin for that workflow, so bringing up a realistic stack required a new plugin layer that can translate Compose concepts into the existing container runtime model.

Scope

This PR adds a first-party container compose plugin that implements the Compose-style orchestration layer in Plugins/container-compose.

It is stacked on top of #1340 because Compose extra_hosts needs the core hosts plumbing introduced there, as well as #1341.

What this changes

  • add the Plugins/container-compose package, plugin config, CLI entrypoints, and debug executable
  • add compose parsing, file merging, include support, env interpolation, project conversion, orchestration, and package-local test coverage
  • implement Compose extra_hosts, health checks, dependency ordering, project naming/path resolution, volume copy-up behavior, and image reuse in the plugin layer

@jglogan

Copy link
Copy Markdown
Contributor

Hi @mazdak, thanks for the PR!

Please read the PR discussion for #239. It describes the approach you'll need to take to build out a compose plugin.

The other approach would be to create a standalone CLI plugin in a Github project that you host and create a signed installer that puts your plugin under the user-installed plugins directory at /usr/local/libexec/container-plugins.

@mazdak

Copy link
Copy Markdown
ContributorAuthor

Hi @mazdak, thanks for the PR!

Please read the PR discussion for #239. It describes the approach you'll need to take to build out a compose plugin.

The other approach would be to create a standalone CLI plugin in a Github project that you host and create a signed installer that puts your plugin under the user-installed plugins directory at /usr/local/libexec/container-plugins.

Sounds good. I will take a crack at that.

@jglogan

Copy link
Copy Markdown
Contributor

Sounds good. I will take a crack at that.

Cool! We here to help either way. If you want to try creating a standalone plugin, open up a discussion and drop a link to it here. We (maintainers at Apple) can't work directly on other repos but we should be able to answer questions in the discussion.

If you're looking at breaking this PR down into a minimally functional plugin as discussed over in the other PR, by all means continue here.

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 2153eed to 6660fe6CompareJuly 30, 2025 21:05
@mazdak

Copy link
Copy Markdown
ContributorAuthor

Sounds good. I will take a crack at that.

Cool! We here to help either way. If you want to try creating a standalone plugin, open up a discussion and drop a link to it here. We (maintainers at Apple) can't work directly on other repos but we should be able to answer questions in the discussion.

If you're looking at breaking this PR down into a minimally functional plugin as discussed over in the other PR, by all means continue here.

I will say that this PR is 99.9% self contained. Everything Compose related is in its own directory, and tested. Only one change was made to Application to amend the compose cli to the list.

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from d7cedc6 to 2909e02CompareJuly 31, 2025 19:05
@jglogan

Copy link
Copy Markdown
Contributor

I will say that this PR is 99.9% self contained. Everything Compose related is in its own directory, and tested. Only one change was made to Application to amend the compose cli to the list.

The other PR is more self-contained; it doesn't hardwire the command into Application.

Self-contained is not the same as "minimally functional". The justification for starting with a "minimally functional" PR and building with PRs for discrete features is over in the other compose PR discussion.

@mazdak

Copy link
Copy Markdown
ContributorAuthor

I will say that this PR is 99.9% self contained. Everything Compose related is in its own directory, and tested. Only one change was made to Application to amend the compose cli to the list.

The other PR is more self-contained; it doesn't hardwire the command into Application.

Self-contained is not the same as "minimally functional". The justification for starting with a "minimally functional" PR and building with PRs for discrete features is over in the other compose PR discussion.

I have refactored this PR to use the plugin architecture

@mazdak
mazdakforce-pushed the mazdak/container-compose branch 3 times, most recently from b25f0b6 to 294f236CompareAugust 9, 2025 12:20
@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 289dbe9 to 910e005CompareAugust 19, 2025 15:58
@mazdak
mazdakforce-pushed the mazdak/container-compose branch 9 times, most recently from 8a9d2fd to 645301bCompareSeptember 3, 2025 15:11
@Mcrich23

Copy link
Copy Markdown
Contributor

Hey! So sorry, but in an effort to make plugin development more possible #603 and #635 have lead to the CLI folder being renamed to ContainerCommands and that will impact the merging of your pull request. Just an FYI, so you understand the issue when you are resolving conflicts.

Also, idk if you are using the existing commands at all for your implementation, but if you are #603 exposes all cli commands as structures for other targets, so you can use them without touching the shell environment.

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 84c62a1 to 7466a97CompareSeptember 21, 2025 21:04
@Mcrich23

Copy link
Copy Markdown
Contributor

Quick question @mazdak, does this implementation support anonymous volumes?

Just trying to figure some things out...

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from e79de20 to 46d43ccCompareMarch 22, 2026 17:07
@mazdakmazdak changed the title Apple Container's implementation of compose functionality using familiar docker-compose YAML syntax.Compose functionality using familiar docker-compose syntax for containerMar 22, 2026
@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 46d43cc to 4f8ac5cCompareMarch 22, 2026 20:24
@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 4f8ac5c to 4acd6f4CompareMarch 22, 2026 20:26
@mazdak

Copy link
Copy Markdown
ContributorAuthor

Quick question @mazdak, does this implementation support anonymous volumes?

Just trying to figure some things out...

Yes, with one important caveat.

What it supports:

  • Short-form anonymous volumes like - /data
  • Long-form anonymous volumes like:
 - type: volume
target: /cache

The caveat:

  • They are not truly Docker-style random anonymous volumes.
  • This implementation gives them deterministic generated names based on project + service + target
  • So in practice they behave more like hidden auto-generated named volumes and will be reused for the same service/target across later up runs.
  • They are cleaned up on down -v via the anonymous-volume label path

@mazdak

Copy link
Copy Markdown
ContributorAuthor

This implementation has been modernized and work on real docker-compose payloads in our repository.

@jglogan

Copy link
Copy Markdown
Contributor

Closing for now, as we're not considering compose for upstream at this time. Please develop this as an external plugin for now. If you have any questions regarding plugin development (we're still getting docs together) feel free to open a discussion topic!

@jgloganjglogan closed this Apr 6, 2026

@vxnkjyffmq-codevxnkjyffmq-code left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay I approve

@vxnkjyffmq-codevxnkjyffmq-code left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I apolog

@vxnkjyffmq-codevxnkjyffmq-code left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🕺🏼🎆

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@mazdak@jglogan@Mcrich23@vxnkjyffmq-code@adeebashraf
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Compose functionality using familiar docker-compose syntax for container by mazdak · Pull Request #398 · apple/container · GitHub
Skip to content

Compose functionality using familiar docker-compose syntax for container - #398

Closed
mazdak wants to merge 3 commits into
apple:mainfrom
mazdak:mazdak/container-compose
Closed

Compose functionality using familiar docker-compose syntax for container#398
mazdak wants to merge 3 commits into
apple:mainfrom
mazdak:mazdak/container-compose

Conversation

@mazdak

@mazdakmazdak commented Jul 30, 2025

Copy link
Copy Markdown
Contributor

Motivation

This branch started from a practical goal: run a real Docker Compose development stack on top of Apple's container tooling.

The immediate workload that drove the implementation was our main repo with contains a fairly normal, but above average complexity compose.yaml file, which relies on normal Compose features such as multi-service orchestration, depends_on, health checks, env_file, profile selection, bind mounts, named volumes, extra_hosts, and image build-or-reuse behavior.

container did not have a Compose-compatible plugin for that workflow, so bringing up a realistic stack required a new plugin layer that can translate Compose concepts into the existing container runtime model.

Scope

This PR adds a first-party container compose plugin that implements the Compose-style orchestration layer in Plugins/container-compose.

It is stacked on top of #1340 because Compose extra_hosts needs the core hosts plumbing introduced there, as well as #1341.

What this changes

  • add the Plugins/container-compose package, plugin config, CLI entrypoints, and debug executable
  • add compose parsing, file merging, include support, env interpolation, project conversion, orchestration, and package-local test coverage
  • implement Compose extra_hosts, health checks, dependency ordering, project naming/path resolution, volume copy-up behavior, and image reuse in the plugin layer

@jglogan

Copy link
Copy Markdown
Contributor

Hi @mazdak, thanks for the PR!

Please read the PR discussion for #239. It describes the approach you'll need to take to build out a compose plugin.

The other approach would be to create a standalone CLI plugin in a Github project that you host and create a signed installer that puts your plugin under the user-installed plugins directory at /usr/local/libexec/container-plugins.

@mazdak

Copy link
Copy Markdown
ContributorAuthor

Hi @mazdak, thanks for the PR!

Please read the PR discussion for #239. It describes the approach you'll need to take to build out a compose plugin.

The other approach would be to create a standalone CLI plugin in a Github project that you host and create a signed installer that puts your plugin under the user-installed plugins directory at /usr/local/libexec/container-plugins.

Sounds good. I will take a crack at that.

@jglogan

Copy link
Copy Markdown
Contributor

Sounds good. I will take a crack at that.

Cool! We here to help either way. If you want to try creating a standalone plugin, open up a discussion and drop a link to it here. We (maintainers at Apple) can't work directly on other repos but we should be able to answer questions in the discussion.

If you're looking at breaking this PR down into a minimally functional plugin as discussed over in the other PR, by all means continue here.

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 2153eed to 6660fe6CompareJuly 30, 2025 21:05
@mazdak

Copy link
Copy Markdown
ContributorAuthor

Sounds good. I will take a crack at that.

Cool! We here to help either way. If you want to try creating a standalone plugin, open up a discussion and drop a link to it here. We (maintainers at Apple) can't work directly on other repos but we should be able to answer questions in the discussion.

If you're looking at breaking this PR down into a minimally functional plugin as discussed over in the other PR, by all means continue here.

I will say that this PR is 99.9% self contained. Everything Compose related is in its own directory, and tested. Only one change was made to Application to amend the compose cli to the list.

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from d7cedc6 to 2909e02CompareJuly 31, 2025 19:05
@jglogan

Copy link
Copy Markdown
Contributor

I will say that this PR is 99.9% self contained. Everything Compose related is in its own directory, and tested. Only one change was made to Application to amend the compose cli to the list.

The other PR is more self-contained; it doesn't hardwire the command into Application.

Self-contained is not the same as "minimally functional". The justification for starting with a "minimally functional" PR and building with PRs for discrete features is over in the other compose PR discussion.

@mazdak

Copy link
Copy Markdown
ContributorAuthor

I will say that this PR is 99.9% self contained. Everything Compose related is in its own directory, and tested. Only one change was made to Application to amend the compose cli to the list.

The other PR is more self-contained; it doesn't hardwire the command into Application.

Self-contained is not the same as "minimally functional". The justification for starting with a "minimally functional" PR and building with PRs for discrete features is over in the other compose PR discussion.

I have refactored this PR to use the plugin architecture

@mazdak
mazdakforce-pushed the mazdak/container-compose branch 3 times, most recently from b25f0b6 to 294f236CompareAugust 9, 2025 12:20
@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 289dbe9 to 910e005CompareAugust 19, 2025 15:58
@mazdak
mazdakforce-pushed the mazdak/container-compose branch 9 times, most recently from 8a9d2fd to 645301bCompareSeptember 3, 2025 15:11
@Mcrich23

Copy link
Copy Markdown
Contributor

Hey! So sorry, but in an effort to make plugin development more possible #603 and #635 have lead to the CLI folder being renamed to ContainerCommands and that will impact the merging of your pull request. Just an FYI, so you understand the issue when you are resolving conflicts.

Also, idk if you are using the existing commands at all for your implementation, but if you are #603 exposes all cli commands as structures for other targets, so you can use them without touching the shell environment.

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 84c62a1 to 7466a97CompareSeptember 21, 2025 21:04
@Mcrich23

Copy link
Copy Markdown
Contributor

Quick question @mazdak, does this implementation support anonymous volumes?

Just trying to figure some things out...

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from e79de20 to 46d43ccCompareMarch 22, 2026 17:07
@mazdakmazdak changed the title Apple Container's implementation of compose functionality using familiar docker-compose YAML syntax.Compose functionality using familiar docker-compose syntax for containerMar 22, 2026
@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 46d43cc to 4f8ac5cCompareMarch 22, 2026 20:24
@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 4f8ac5c to 4acd6f4CompareMarch 22, 2026 20:26
@mazdak

Copy link
Copy Markdown
ContributorAuthor

Quick question @mazdak, does this implementation support anonymous volumes?

Just trying to figure some things out...

Yes, with one important caveat.

What it supports:

  • Short-form anonymous volumes like - /data
  • Long-form anonymous volumes like:
 - type: volume
target: /cache

The caveat:

  • They are not truly Docker-style random anonymous volumes.
  • This implementation gives them deterministic generated names based on project + service + target
  • So in practice they behave more like hidden auto-generated named volumes and will be reused for the same service/target across later up runs.
  • They are cleaned up on down -v via the anonymous-volume label path

@mazdak

Copy link
Copy Markdown
ContributorAuthor

This implementation has been modernized and work on real docker-compose payloads in our repository.

@jglogan

Copy link
Copy Markdown
Contributor

Closing for now, as we're not considering compose for upstream at this time. Please develop this as an external plugin for now. If you have any questions regarding plugin development (we're still getting docs together) feel free to open a discussion topic!

@jgloganjglogan closed this Apr 6, 2026

@vxnkjyffmq-codevxnkjyffmq-code left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay I approve

@vxnkjyffmq-codevxnkjyffmq-code left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I apolog

@vxnkjyffmq-codevxnkjyffmq-code left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🕺🏼🎆

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@mazdak@jglogan@Mcrich23@vxnkjyffmq-code@adeebashraf
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); Compose functionality using familiar docker-compose syntax for container by mazdak · Pull Request #398 · apple/container · GitHub
Skip to content

Compose functionality using familiar docker-compose syntax for container - #398

Closed
mazdak wants to merge 3 commits into
apple:mainfrom
mazdak:mazdak/container-compose
Closed

Compose functionality using familiar docker-compose syntax for container#398
mazdak wants to merge 3 commits into
apple:mainfrom
mazdak:mazdak/container-compose

Conversation

@mazdak

@mazdakmazdak commented Jul 30, 2025

Copy link
Copy Markdown
Contributor

Motivation

This branch started from a practical goal: run a real Docker Compose development stack on top of Apple's container tooling.

The immediate workload that drove the implementation was our main repo with contains a fairly normal, but above average complexity compose.yaml file, which relies on normal Compose features such as multi-service orchestration, depends_on, health checks, env_file, profile selection, bind mounts, named volumes, extra_hosts, and image build-or-reuse behavior.

container did not have a Compose-compatible plugin for that workflow, so bringing up a realistic stack required a new plugin layer that can translate Compose concepts into the existing container runtime model.

Scope

This PR adds a first-party container compose plugin that implements the Compose-style orchestration layer in Plugins/container-compose.

It is stacked on top of #1340 because Compose extra_hosts needs the core hosts plumbing introduced there, as well as #1341.

What this changes

  • add the Plugins/container-compose package, plugin config, CLI entrypoints, and debug executable
  • add compose parsing, file merging, include support, env interpolation, project conversion, orchestration, and package-local test coverage
  • implement Compose extra_hosts, health checks, dependency ordering, project naming/path resolution, volume copy-up behavior, and image reuse in the plugin layer

@jglogan

Copy link
Copy Markdown
Contributor

Hi @mazdak, thanks for the PR!

Please read the PR discussion for #239. It describes the approach you'll need to take to build out a compose plugin.

The other approach would be to create a standalone CLI plugin in a Github project that you host and create a signed installer that puts your plugin under the user-installed plugins directory at /usr/local/libexec/container-plugins.

@mazdak

Copy link
Copy Markdown
ContributorAuthor

Hi @mazdak, thanks for the PR!

Please read the PR discussion for #239. It describes the approach you'll need to take to build out a compose plugin.

The other approach would be to create a standalone CLI plugin in a Github project that you host and create a signed installer that puts your plugin under the user-installed plugins directory at /usr/local/libexec/container-plugins.

Sounds good. I will take a crack at that.

@jglogan

Copy link
Copy Markdown
Contributor

Sounds good. I will take a crack at that.

Cool! We here to help either way. If you want to try creating a standalone plugin, open up a discussion and drop a link to it here. We (maintainers at Apple) can't work directly on other repos but we should be able to answer questions in the discussion.

If you're looking at breaking this PR down into a minimally functional plugin as discussed over in the other PR, by all means continue here.

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 2153eed to 6660fe6CompareJuly 30, 2025 21:05
@mazdak

Copy link
Copy Markdown
ContributorAuthor

Sounds good. I will take a crack at that.

Cool! We here to help either way. If you want to try creating a standalone plugin, open up a discussion and drop a link to it here. We (maintainers at Apple) can't work directly on other repos but we should be able to answer questions in the discussion.

If you're looking at breaking this PR down into a minimally functional plugin as discussed over in the other PR, by all means continue here.

I will say that this PR is 99.9% self contained. Everything Compose related is in its own directory, and tested. Only one change was made to Application to amend the compose cli to the list.

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from d7cedc6 to 2909e02CompareJuly 31, 2025 19:05
@jglogan

Copy link
Copy Markdown
Contributor

I will say that this PR is 99.9% self contained. Everything Compose related is in its own directory, and tested. Only one change was made to Application to amend the compose cli to the list.

The other PR is more self-contained; it doesn't hardwire the command into Application.

Self-contained is not the same as "minimally functional". The justification for starting with a "minimally functional" PR and building with PRs for discrete features is over in the other compose PR discussion.

@mazdak

Copy link
Copy Markdown
ContributorAuthor

I will say that this PR is 99.9% self contained. Everything Compose related is in its own directory, and tested. Only one change was made to Application to amend the compose cli to the list.

The other PR is more self-contained; it doesn't hardwire the command into Application.

Self-contained is not the same as "minimally functional". The justification for starting with a "minimally functional" PR and building with PRs for discrete features is over in the other compose PR discussion.

I have refactored this PR to use the plugin architecture

@mazdak
mazdakforce-pushed the mazdak/container-compose branch 3 times, most recently from b25f0b6 to 294f236CompareAugust 9, 2025 12:20
@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 289dbe9 to 910e005CompareAugust 19, 2025 15:58
@mazdak
mazdakforce-pushed the mazdak/container-compose branch 9 times, most recently from 8a9d2fd to 645301bCompareSeptember 3, 2025 15:11
@Mcrich23

Copy link
Copy Markdown
Contributor

Hey! So sorry, but in an effort to make plugin development more possible #603 and #635 have lead to the CLI folder being renamed to ContainerCommands and that will impact the merging of your pull request. Just an FYI, so you understand the issue when you are resolving conflicts.

Also, idk if you are using the existing commands at all for your implementation, but if you are #603 exposes all cli commands as structures for other targets, so you can use them without touching the shell environment.

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 84c62a1 to 7466a97CompareSeptember 21, 2025 21:04
@Mcrich23

Copy link
Copy Markdown
Contributor

Quick question @mazdak, does this implementation support anonymous volumes?

Just trying to figure some things out...

@mazdak
mazdakforce-pushed the mazdak/container-compose branch from e79de20 to 46d43ccCompareMarch 22, 2026 17:07
@mazdakmazdak changed the title Apple Container's implementation of compose functionality using familiar docker-compose YAML syntax.Compose functionality using familiar docker-compose syntax for containerMar 22, 2026
@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 46d43cc to 4f8ac5cCompareMarch 22, 2026 20:24
@mazdak
mazdakforce-pushed the mazdak/container-compose branch from 4f8ac5c to 4acd6f4CompareMarch 22, 2026 20:26
@mazdak

Copy link
Copy Markdown
ContributorAuthor

Quick question @mazdak, does this implementation support anonymous volumes?

Just trying to figure some things out...

Yes, with one important caveat.

What it supports:

  • Short-form anonymous volumes like - /data
  • Long-form anonymous volumes like:
 - type: volume
target: /cache

The caveat:

  • They are not truly Docker-style random anonymous volumes.
  • This implementation gives them deterministic generated names based on project + service + target
  • So in practice they behave more like hidden auto-generated named volumes and will be reused for the same service/target across later up runs.
  • They are cleaned up on down -v via the anonymous-volume label path

@mazdak

Copy link
Copy Markdown
ContributorAuthor

This implementation has been modernized and work on real docker-compose payloads in our repository.

@jglogan

Copy link
Copy Markdown
Contributor

Closing for now, as we're not considering compose for upstream at this time. Please develop this as an external plugin for now. If you have any questions regarding plugin development (we're still getting docs together) feel free to open a discussion topic!

@jgloganjglogan closed this Apr 6, 2026

@vxnkjyffmq-codevxnkjyffmq-code left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay I approve

@vxnkjyffmq-codevxnkjyffmq-code left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I apolog

@vxnkjyffmq-codevxnkjyffmq-code left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🕺🏼🎆

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@mazdak@jglogan@Mcrich23@vxnkjyffmq-code@adeebashraf