Added "docker exec" command for a service or all services. - #1180

Closed
osteenbergen wants to merge 2 commits into
docker:masterfrom
osteenbergen:execute
Closed

Added "docker exec" command for a service or all services. #1180
osteenbergen wants to merge 2 commits into
docker:masterfrom
osteenbergen:execute

Conversation

@osteenbergen

Copy link
Copy Markdown

Example:

$ docker-compose execute busybox echo "Hello World!"

Supports --detach for background running
Supports running command on all containers with:

$ docker-compose execute all echo "Hello World!"
----- busy_busybox_1-----
Hello World!
----- busy_busybox2_1 -----
Hello World!
----- busy_busybox2_2 -----
Hello World!

Example:
$ docker-compose execute web echo "Hello World!"
Supports --detach for background running
Supports running command on all containers with:
$ docker-compose execute all echo "Hello World!"
Signed-off-by: Onno Steenbergen <onno@steenbe.nl>
@ghost

Copy link
Copy Markdown

That sounds awesome, +1 for merging it!

@Vrakfall

Copy link
Copy Markdown

+1

@aanand

Copy link
Copy Markdown

Thanks for contributing!

  1. The command should be called exec, not execute, to keep consistency with docker exec.
  2. all is a cool feature, but it should be a flag (i.e. --all), not a positional argument. Using --all alongside any service names should be an error.
  3. exec should be interactive - we should use dockerpty to attach to the process. This might require changes to dockerpty or docker-py.

@aanand

Copy link
Copy Markdown

Oh, and:

  • The -i and -t flags should be supported, just as with docker exec.
  • docker-compose exec -i --all CMD or docker-compose exec web db CMD should be an error - you can't run a command interactively against multiple services.

@osteenbergen

Copy link
Copy Markdown
Author

Aanan, thanks for your comments and I will integrate them as soon as possible

  1. I named it execute as exec is a python build in command, will change it
  2. --all was my first version although it became difficult to distinguish between:
    docker-compose exec apache2 ps aux and docker-compose exec apache2. But I have just thought of a simple solution, so no problem there
  3. Interactive is a bit wierd as discussed in: Support docker exec command #593 (comment) Although I can limit it to a service with one container. Need to look into dockerpty on how to support the terminals. -i & -t are not a problem as they exist in the docker-py execute command

@ghost

Copy link
Copy Markdown

Agree that interactive is a little weird.

I understand that docker images with SSH are not really the way to go, but if you really want interactivity on multiple machines, something like SSH + clusterssh (or similar projects) are probably the way to go.

all is now an options (--all)
Renamed long_running to long-running so all folders have the same name convention
exec is a python reserved word so needed to change docopt_command to allow for reserved words.
Signed-off-by: Onno Steenbergen <onno@steenbe.nl>
@osteenbergen

Copy link
Copy Markdown
Author

Point 1 & 2 are integrated.

It seems that the Jenkins build bot has an error.

 docker build --rm --force-rm -t compose:docker-compose:3951ce4 .
time="2015-03-27T16:40:06-04:00" level=fatal msg="Invalid repository name (compose:docker-compose), only [a-z0-9-_.] are allowed"

About the commit itself:

Due to the way docopt works my only way to have --all was to write the usage line as
Usage: exec [options] [ SERVICE CMD... | CMD... ]

Other combinations (Usage: exec [options] [SERVICE] CMD...) could not handle single commands on all services.

$ docker-compose exec --all ps

@aanand

Copy link
Copy Markdown

I think that if there are multiple containers for a service running, Compose should either refuse to run exec or pick an arbitrary container.

Thinking about it, execing on multiple services (and, by extension, exec --all) is not an MVP feature. Since it complicates things like command parsing, I think it'd be better to just remove it.

@osteenbergen

Copy link
Copy Markdown
Author

I do not agree that compose exec should always run on a single container, unless you were talking about the interactive option.

The idea is to have a service (or system with --all) in a predictable state, executing a command on a single worker could result in different behaviour. Over time this will lead to an unstable system.

The use-case of exec is to inspect or to fix a small problem in a live environment. If for example the next heartbleed happens and you want to update all certificates with a gracefull restart you can do: compose exec apache apachectl -k graceful. However maybe the compose consist of apache image for serving content and a service using apache image for loadbalanding. Then the same command can be execute on both services.

I agree that there aren't many use cases, but we can't predict the usage of compose. Maybe some user like to have an arbitrary container, which can be solved by a --pick-random option. However I understand that we should not complicate stuff by jamming a lot of features into compose.

For parsing the output we could add a output folder option. This will create a separate file for every container running in the service/system.

@aanand

Copy link
Copy Markdown

I can believe there are a few good use cases for running an exec on all containers for a service, although doing an upgrade is a bad one - you should be updating your image and restarting your containers for that. Running some kind of diagnostic command is a good one.

But Compose isn't (yet) a tool for production environments, and so there isn't a strong need for that feature now. What would be useful, right now, is a command for inspecting a running container - an analogue to docker exec -it that doesn't require you to type a full service name.

@osteenbergen

Copy link
Copy Markdown
Author

Will work on that (need to add support for exec in dockerpty). As soon as that is finished and pulled I will update this pull.

@mattes

Copy link
Copy Markdown

+1

@mcortinas

Copy link
Copy Markdown

+1

1 similar comment
@antono

Copy link
Copy Markdown

+1

@aanand

Copy link
Copy Markdown

Closing as #2023 is the direction we're going in - thanks for the PR!

@aanandaanand closed this Dec 17, 2015
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@osteenbergen@Vrakfall@aanand@mattes@mcortinas@antono@dnephin
, '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" + '
Skip to content

Added "docker exec" command for a service or all services. - #1180

Closed
osteenbergen wants to merge 2 commits into
docker:masterfrom
osteenbergen:execute
Closed

Added "docker exec" command for a service or all services. #1180
osteenbergen wants to merge 2 commits into
docker:masterfrom
osteenbergen:execute

Conversation

@osteenbergen

Copy link
Copy Markdown

Example:

$ docker-compose execute busybox echo "Hello World!"

Supports --detach for background running
Supports running command on all containers with:

$ docker-compose execute all echo "Hello World!"
----- busy_busybox_1-----
Hello World!
----- busy_busybox2_1 -----
Hello World!
----- busy_busybox2_2 -----
Hello World!

Example:
$ docker-compose execute web echo "Hello World!"
Supports --detach for background running
Supports running command on all containers with:
$ docker-compose execute all echo "Hello World!"
Signed-off-by: Onno Steenbergen <onno@steenbe.nl>
@ghost

Copy link
Copy Markdown

That sounds awesome, +1 for merging it!

@Vrakfall

Copy link
Copy Markdown

+1

@aanand

Copy link
Copy Markdown

Thanks for contributing!

  1. The command should be called exec, not execute, to keep consistency with docker exec.
  2. all is a cool feature, but it should be a flag (i.e. --all), not a positional argument. Using --all alongside any service names should be an error.
  3. exec should be interactive - we should use dockerpty to attach to the process. This might require changes to dockerpty or docker-py.

@aanand

Copy link
Copy Markdown

Oh, and:

  • The -i and -t flags should be supported, just as with docker exec.
  • docker-compose exec -i --all CMD or docker-compose exec web db CMD should be an error - you can't run a command interactively against multiple services.

@osteenbergen

Copy link
Copy Markdown
Author

Aanan, thanks for your comments and I will integrate them as soon as possible

  1. I named it execute as exec is a python build in command, will change it
  2. --all was my first version although it became difficult to distinguish between:
    docker-compose exec apache2 ps aux and docker-compose exec apache2. But I have just thought of a simple solution, so no problem there
  3. Interactive is a bit wierd as discussed in: Support docker exec command #593 (comment) Although I can limit it to a service with one container. Need to look into dockerpty on how to support the terminals. -i & -t are not a problem as they exist in the docker-py execute command

@ghost

Copy link
Copy Markdown

Agree that interactive is a little weird.

I understand that docker images with SSH are not really the way to go, but if you really want interactivity on multiple machines, something like SSH + clusterssh (or similar projects) are probably the way to go.

all is now an options (--all)
Renamed long_running to long-running so all folders have the same name convention
exec is a python reserved word so needed to change docopt_command to allow for reserved words.
Signed-off-by: Onno Steenbergen <onno@steenbe.nl>
@osteenbergen

Copy link
Copy Markdown
Author

Point 1 & 2 are integrated.

It seems that the Jenkins build bot has an error.

 docker build --rm --force-rm -t compose:docker-compose:3951ce4 .
time="2015-03-27T16:40:06-04:00" level=fatal msg="Invalid repository name (compose:docker-compose), only [a-z0-9-_.] are allowed"

About the commit itself:

Due to the way docopt works my only way to have --all was to write the usage line as
Usage: exec [options] [ SERVICE CMD... | CMD... ]

Other combinations (Usage: exec [options] [SERVICE] CMD...) could not handle single commands on all services.

$ docker-compose exec --all ps

@aanand

Copy link
Copy Markdown

I think that if there are multiple containers for a service running, Compose should either refuse to run exec or pick an arbitrary container.

Thinking about it, execing on multiple services (and, by extension, exec --all) is not an MVP feature. Since it complicates things like command parsing, I think it'd be better to just remove it.

@osteenbergen

Copy link
Copy Markdown
Author

I do not agree that compose exec should always run on a single container, unless you were talking about the interactive option.

The idea is to have a service (or system with --all) in a predictable state, executing a command on a single worker could result in different behaviour. Over time this will lead to an unstable system.

The use-case of exec is to inspect or to fix a small problem in a live environment. If for example the next heartbleed happens and you want to update all certificates with a gracefull restart you can do: compose exec apache apachectl -k graceful. However maybe the compose consist of apache image for serving content and a service using apache image for loadbalanding. Then the same command can be execute on both services.

I agree that there aren't many use cases, but we can't predict the usage of compose. Maybe some user like to have an arbitrary container, which can be solved by a --pick-random option. However I understand that we should not complicate stuff by jamming a lot of features into compose.

For parsing the output we could add a output folder option. This will create a separate file for every container running in the service/system.

@aanand

Copy link
Copy Markdown

I can believe there are a few good use cases for running an exec on all containers for a service, although doing an upgrade is a bad one - you should be updating your image and restarting your containers for that. Running some kind of diagnostic command is a good one.

But Compose isn't (yet) a tool for production environments, and so there isn't a strong need for that feature now. What would be useful, right now, is a command for inspecting a running container - an analogue to docker exec -it that doesn't require you to type a full service name.

@osteenbergen

Copy link
Copy Markdown
Author

Will work on that (need to add support for exec in dockerpty). As soon as that is finished and pulled I will update this pull.

@mattes

Copy link
Copy Markdown

+1

@mcortinas

Copy link
Copy Markdown

+1

1 similar comment
@antono

Copy link
Copy Markdown

+1

@aanand

Copy link
Copy Markdown

Closing as #2023 is the direction we're going in - thanks for the PR!

@aanandaanand closed this Dec 17, 2015
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@osteenbergen@Vrakfall@aanand@mattes@mcortinas@antono@dnephin
, '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('^' + ".*" + '
Skip to content

Added "docker exec" command for a service or all services. - #1180

Closed
osteenbergen wants to merge 2 commits into
docker:masterfrom
osteenbergen:execute
Closed

Added "docker exec" command for a service or all services. #1180
osteenbergen wants to merge 2 commits into
docker:masterfrom
osteenbergen:execute

Conversation

@osteenbergen

Copy link
Copy Markdown

Example:

$ docker-compose execute busybox echo "Hello World!"

Supports --detach for background running
Supports running command on all containers with:

$ docker-compose execute all echo "Hello World!"
----- busy_busybox_1-----
Hello World!
----- busy_busybox2_1 -----
Hello World!
----- busy_busybox2_2 -----
Hello World!

Example:
$ docker-compose execute web echo "Hello World!"
Supports --detach for background running
Supports running command on all containers with:
$ docker-compose execute all echo "Hello World!"
Signed-off-by: Onno Steenbergen <onno@steenbe.nl>
@ghost

Copy link
Copy Markdown

That sounds awesome, +1 for merging it!

@Vrakfall

Copy link
Copy Markdown

+1

@aanand

Copy link
Copy Markdown

Thanks for contributing!

  1. The command should be called exec, not execute, to keep consistency with docker exec.
  2. all is a cool feature, but it should be a flag (i.e. --all), not a positional argument. Using --all alongside any service names should be an error.
  3. exec should be interactive - we should use dockerpty to attach to the process. This might require changes to dockerpty or docker-py.

@aanand

Copy link
Copy Markdown

Oh, and:

  • The -i and -t flags should be supported, just as with docker exec.
  • docker-compose exec -i --all CMD or docker-compose exec web db CMD should be an error - you can't run a command interactively against multiple services.

@osteenbergen

Copy link
Copy Markdown
Author

Aanan, thanks for your comments and I will integrate them as soon as possible

  1. I named it execute as exec is a python build in command, will change it
  2. --all was my first version although it became difficult to distinguish between:
    docker-compose exec apache2 ps aux and docker-compose exec apache2. But I have just thought of a simple solution, so no problem there
  3. Interactive is a bit wierd as discussed in: Support docker exec command #593 (comment) Although I can limit it to a service with one container. Need to look into dockerpty on how to support the terminals. -i & -t are not a problem as they exist in the docker-py execute command

@ghost

Copy link
Copy Markdown

Agree that interactive is a little weird.

I understand that docker images with SSH are not really the way to go, but if you really want interactivity on multiple machines, something like SSH + clusterssh (or similar projects) are probably the way to go.

all is now an options (--all)
Renamed long_running to long-running so all folders have the same name convention
exec is a python reserved word so needed to change docopt_command to allow for reserved words.
Signed-off-by: Onno Steenbergen <onno@steenbe.nl>
@osteenbergen

Copy link
Copy Markdown
Author

Point 1 & 2 are integrated.

It seems that the Jenkins build bot has an error.

 docker build --rm --force-rm -t compose:docker-compose:3951ce4 .
time="2015-03-27T16:40:06-04:00" level=fatal msg="Invalid repository name (compose:docker-compose), only [a-z0-9-_.] are allowed"

About the commit itself:

Due to the way docopt works my only way to have --all was to write the usage line as
Usage: exec [options] [ SERVICE CMD... | CMD... ]

Other combinations (Usage: exec [options] [SERVICE] CMD...) could not handle single commands on all services.

$ docker-compose exec --all ps

@aanand

Copy link
Copy Markdown

I think that if there are multiple containers for a service running, Compose should either refuse to run exec or pick an arbitrary container.

Thinking about it, execing on multiple services (and, by extension, exec --all) is not an MVP feature. Since it complicates things like command parsing, I think it'd be better to just remove it.

@osteenbergen

Copy link
Copy Markdown
Author

I do not agree that compose exec should always run on a single container, unless you were talking about the interactive option.

The idea is to have a service (or system with --all) in a predictable state, executing a command on a single worker could result in different behaviour. Over time this will lead to an unstable system.

The use-case of exec is to inspect or to fix a small problem in a live environment. If for example the next heartbleed happens and you want to update all certificates with a gracefull restart you can do: compose exec apache apachectl -k graceful. However maybe the compose consist of apache image for serving content and a service using apache image for loadbalanding. Then the same command can be execute on both services.

I agree that there aren't many use cases, but we can't predict the usage of compose. Maybe some user like to have an arbitrary container, which can be solved by a --pick-random option. However I understand that we should not complicate stuff by jamming a lot of features into compose.

For parsing the output we could add a output folder option. This will create a separate file for every container running in the service/system.

@aanand

Copy link
Copy Markdown

I can believe there are a few good use cases for running an exec on all containers for a service, although doing an upgrade is a bad one - you should be updating your image and restarting your containers for that. Running some kind of diagnostic command is a good one.

But Compose isn't (yet) a tool for production environments, and so there isn't a strong need for that feature now. What would be useful, right now, is a command for inspecting a running container - an analogue to docker exec -it that doesn't require you to type a full service name.

@osteenbergen

Copy link
Copy Markdown
Author

Will work on that (need to add support for exec in dockerpty). As soon as that is finished and pulled I will update this pull.

@mattes

Copy link
Copy Markdown

+1

@mcortinas

Copy link
Copy Markdown

+1

1 similar comment
@antono

Copy link
Copy Markdown

+1

@aanand

Copy link
Copy Markdown

Closing as #2023 is the direction we're going in - thanks for the PR!

@aanandaanand closed this Dec 17, 2015
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@osteenbergen@Vrakfall@aanand@mattes@mcortinas@antono@dnephin
, '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('^' + ".*" + '
Skip to content

Added "docker exec" command for a service or all services. - #1180

Closed
osteenbergen wants to merge 2 commits into
docker:masterfrom
osteenbergen:execute
Closed

Added "docker exec" command for a service or all services. #1180
osteenbergen wants to merge 2 commits into
docker:masterfrom
osteenbergen:execute

Conversation

@osteenbergen

Copy link
Copy Markdown

Example:

$ docker-compose execute busybox echo "Hello World!"

Supports --detach for background running
Supports running command on all containers with:

$ docker-compose execute all echo "Hello World!"
----- busy_busybox_1-----
Hello World!
----- busy_busybox2_1 -----
Hello World!
----- busy_busybox2_2 -----
Hello World!

Example:
$ docker-compose execute web echo "Hello World!"
Supports --detach for background running
Supports running command on all containers with:
$ docker-compose execute all echo "Hello World!"
Signed-off-by: Onno Steenbergen <onno@steenbe.nl>
@ghost

Copy link
Copy Markdown

That sounds awesome, +1 for merging it!

@Vrakfall

Copy link
Copy Markdown

+1

@aanand

Copy link
Copy Markdown

Thanks for contributing!

  1. The command should be called exec, not execute, to keep consistency with docker exec.
  2. all is a cool feature, but it should be a flag (i.e. --all), not a positional argument. Using --all alongside any service names should be an error.
  3. exec should be interactive - we should use dockerpty to attach to the process. This might require changes to dockerpty or docker-py.

@aanand

Copy link
Copy Markdown

Oh, and:

  • The -i and -t flags should be supported, just as with docker exec.
  • docker-compose exec -i --all CMD or docker-compose exec web db CMD should be an error - you can't run a command interactively against multiple services.

@osteenbergen

Copy link
Copy Markdown
Author

Aanan, thanks for your comments and I will integrate them as soon as possible

  1. I named it execute as exec is a python build in command, will change it
  2. --all was my first version although it became difficult to distinguish between:
    docker-compose exec apache2 ps aux and docker-compose exec apache2. But I have just thought of a simple solution, so no problem there
  3. Interactive is a bit wierd as discussed in: Support docker exec command #593 (comment) Although I can limit it to a service with one container. Need to look into dockerpty on how to support the terminals. -i & -t are not a problem as they exist in the docker-py execute command

@ghost

Copy link
Copy Markdown

Agree that interactive is a little weird.

I understand that docker images with SSH are not really the way to go, but if you really want interactivity on multiple machines, something like SSH + clusterssh (or similar projects) are probably the way to go.

all is now an options (--all)
Renamed long_running to long-running so all folders have the same name convention
exec is a python reserved word so needed to change docopt_command to allow for reserved words.
Signed-off-by: Onno Steenbergen <onno@steenbe.nl>
@osteenbergen

Copy link
Copy Markdown
Author

Point 1 & 2 are integrated.

It seems that the Jenkins build bot has an error.

 docker build --rm --force-rm -t compose:docker-compose:3951ce4 .
time="2015-03-27T16:40:06-04:00" level=fatal msg="Invalid repository name (compose:docker-compose), only [a-z0-9-_.] are allowed"

About the commit itself:

Due to the way docopt works my only way to have --all was to write the usage line as
Usage: exec [options] [ SERVICE CMD... | CMD... ]

Other combinations (Usage: exec [options] [SERVICE] CMD...) could not handle single commands on all services.

$ docker-compose exec --all ps

@aanand

Copy link
Copy Markdown

I think that if there are multiple containers for a service running, Compose should either refuse to run exec or pick an arbitrary container.

Thinking about it, execing on multiple services (and, by extension, exec --all) is not an MVP feature. Since it complicates things like command parsing, I think it'd be better to just remove it.

@osteenbergen

Copy link
Copy Markdown
Author

I do not agree that compose exec should always run on a single container, unless you were talking about the interactive option.

The idea is to have a service (or system with --all) in a predictable state, executing a command on a single worker could result in different behaviour. Over time this will lead to an unstable system.

The use-case of exec is to inspect or to fix a small problem in a live environment. If for example the next heartbleed happens and you want to update all certificates with a gracefull restart you can do: compose exec apache apachectl -k graceful. However maybe the compose consist of apache image for serving content and a service using apache image for loadbalanding. Then the same command can be execute on both services.

I agree that there aren't many use cases, but we can't predict the usage of compose. Maybe some user like to have an arbitrary container, which can be solved by a --pick-random option. However I understand that we should not complicate stuff by jamming a lot of features into compose.

For parsing the output we could add a output folder option. This will create a separate file for every container running in the service/system.

@aanand

Copy link
Copy Markdown

I can believe there are a few good use cases for running an exec on all containers for a service, although doing an upgrade is a bad one - you should be updating your image and restarting your containers for that. Running some kind of diagnostic command is a good one.

But Compose isn't (yet) a tool for production environments, and so there isn't a strong need for that feature now. What would be useful, right now, is a command for inspecting a running container - an analogue to docker exec -it that doesn't require you to type a full service name.

@osteenbergen

Copy link
Copy Markdown
Author

Will work on that (need to add support for exec in dockerpty). As soon as that is finished and pulled I will update this pull.

@mattes

Copy link
Copy Markdown

+1

@mcortinas

Copy link
Copy Markdown

+1

1 similar comment
@antono

Copy link
Copy Markdown

+1

@aanand

Copy link
Copy Markdown

Closing as #2023 is the direction we're going in - thanks for the PR!

@aanandaanand closed this Dec 17, 2015
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@osteenbergen@Vrakfall@aanand@mattes@mcortinas@antono@dnephin
, '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" + '
Skip to content

Added "docker exec" command for a service or all services. - #1180

Closed
osteenbergen wants to merge 2 commits into
docker:masterfrom
osteenbergen:execute
Closed

Added "docker exec" command for a service or all services. #1180
osteenbergen wants to merge 2 commits into
docker:masterfrom
osteenbergen:execute

Conversation

@osteenbergen

Copy link
Copy Markdown

Example:

$ docker-compose execute busybox echo "Hello World!"

Supports --detach for background running
Supports running command on all containers with:

$ docker-compose execute all echo "Hello World!"
----- busy_busybox_1-----
Hello World!
----- busy_busybox2_1 -----
Hello World!
----- busy_busybox2_2 -----
Hello World!

Example:
$ docker-compose execute web echo "Hello World!"
Supports --detach for background running
Supports running command on all containers with:
$ docker-compose execute all echo "Hello World!"
Signed-off-by: Onno Steenbergen <onno@steenbe.nl>
@ghost

Copy link
Copy Markdown

That sounds awesome, +1 for merging it!

@Vrakfall

Copy link
Copy Markdown

+1

@aanand

Copy link
Copy Markdown

Thanks for contributing!

  1. The command should be called exec, not execute, to keep consistency with docker exec.
  2. all is a cool feature, but it should be a flag (i.e. --all), not a positional argument. Using --all alongside any service names should be an error.
  3. exec should be interactive - we should use dockerpty to attach to the process. This might require changes to dockerpty or docker-py.

@aanand

Copy link
Copy Markdown

Oh, and:

  • The -i and -t flags should be supported, just as with docker exec.
  • docker-compose exec -i --all CMD or docker-compose exec web db CMD should be an error - you can't run a command interactively against multiple services.

@osteenbergen

Copy link
Copy Markdown
Author

Aanan, thanks for your comments and I will integrate them as soon as possible

  1. I named it execute as exec is a python build in command, will change it
  2. --all was my first version although it became difficult to distinguish between:
    docker-compose exec apache2 ps aux and docker-compose exec apache2. But I have just thought of a simple solution, so no problem there
  3. Interactive is a bit wierd as discussed in: Support docker exec command #593 (comment) Although I can limit it to a service with one container. Need to look into dockerpty on how to support the terminals. -i & -t are not a problem as they exist in the docker-py execute command

@ghost

Copy link
Copy Markdown

Agree that interactive is a little weird.

I understand that docker images with SSH are not really the way to go, but if you really want interactivity on multiple machines, something like SSH + clusterssh (or similar projects) are probably the way to go.

all is now an options (--all)
Renamed long_running to long-running so all folders have the same name convention
exec is a python reserved word so needed to change docopt_command to allow for reserved words.
Signed-off-by: Onno Steenbergen <onno@steenbe.nl>
@osteenbergen

Copy link
Copy Markdown
Author

Point 1 & 2 are integrated.

It seems that the Jenkins build bot has an error.

 docker build --rm --force-rm -t compose:docker-compose:3951ce4 .
time="2015-03-27T16:40:06-04:00" level=fatal msg="Invalid repository name (compose:docker-compose), only [a-z0-9-_.] are allowed"

About the commit itself:

Due to the way docopt works my only way to have --all was to write the usage line as
Usage: exec [options] [ SERVICE CMD... | CMD... ]

Other combinations (Usage: exec [options] [SERVICE] CMD...) could not handle single commands on all services.

$ docker-compose exec --all ps

@aanand

Copy link
Copy Markdown

I think that if there are multiple containers for a service running, Compose should either refuse to run exec or pick an arbitrary container.

Thinking about it, execing on multiple services (and, by extension, exec --all) is not an MVP feature. Since it complicates things like command parsing, I think it'd be better to just remove it.

@osteenbergen

Copy link
Copy Markdown
Author

I do not agree that compose exec should always run on a single container, unless you were talking about the interactive option.

The idea is to have a service (or system with --all) in a predictable state, executing a command on a single worker could result in different behaviour. Over time this will lead to an unstable system.

The use-case of exec is to inspect or to fix a small problem in a live environment. If for example the next heartbleed happens and you want to update all certificates with a gracefull restart you can do: compose exec apache apachectl -k graceful. However maybe the compose consist of apache image for serving content and a service using apache image for loadbalanding. Then the same command can be execute on both services.

I agree that there aren't many use cases, but we can't predict the usage of compose. Maybe some user like to have an arbitrary container, which can be solved by a --pick-random option. However I understand that we should not complicate stuff by jamming a lot of features into compose.

For parsing the output we could add a output folder option. This will create a separate file for every container running in the service/system.

@aanand

Copy link
Copy Markdown

I can believe there are a few good use cases for running an exec on all containers for a service, although doing an upgrade is a bad one - you should be updating your image and restarting your containers for that. Running some kind of diagnostic command is a good one.

But Compose isn't (yet) a tool for production environments, and so there isn't a strong need for that feature now. What would be useful, right now, is a command for inspecting a running container - an analogue to docker exec -it that doesn't require you to type a full service name.

@osteenbergen

Copy link
Copy Markdown
Author

Will work on that (need to add support for exec in dockerpty). As soon as that is finished and pulled I will update this pull.

@mattes

Copy link
Copy Markdown

+1

@mcortinas

Copy link
Copy Markdown

+1

1 similar comment
@antono

Copy link
Copy Markdown

+1

@aanand

Copy link
Copy Markdown

Closing as #2023 is the direction we're going in - thanks for the PR!

@aanandaanand closed this Dec 17, 2015
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@osteenbergen@Vrakfall@aanand@mattes@mcortinas@antono@dnephin
, '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('^' + ".*" + '
Skip to content

Added "docker exec" command for a service or all services. - #1180

Closed
osteenbergen wants to merge 2 commits into
docker:masterfrom
osteenbergen:execute
Closed

Added "docker exec" command for a service or all services. #1180
osteenbergen wants to merge 2 commits into
docker:masterfrom
osteenbergen:execute

Conversation

@osteenbergen

Copy link
Copy Markdown

Example:

$ docker-compose execute busybox echo "Hello World!"

Supports --detach for background running
Supports running command on all containers with:

$ docker-compose execute all echo "Hello World!"
----- busy_busybox_1-----
Hello World!
----- busy_busybox2_1 -----
Hello World!
----- busy_busybox2_2 -----
Hello World!

Example:
$ docker-compose execute web echo "Hello World!"
Supports --detach for background running
Supports running command on all containers with:
$ docker-compose execute all echo "Hello World!"
Signed-off-by: Onno Steenbergen <onno@steenbe.nl>
@ghost

Copy link
Copy Markdown

That sounds awesome, +1 for merging it!

@Vrakfall

Copy link
Copy Markdown

+1

@aanand

Copy link
Copy Markdown

Thanks for contributing!

  1. The command should be called exec, not execute, to keep consistency with docker exec.
  2. all is a cool feature, but it should be a flag (i.e. --all), not a positional argument. Using --all alongside any service names should be an error.
  3. exec should be interactive - we should use dockerpty to attach to the process. This might require changes to dockerpty or docker-py.

@aanand

Copy link
Copy Markdown

Oh, and:

  • The -i and -t flags should be supported, just as with docker exec.
  • docker-compose exec -i --all CMD or docker-compose exec web db CMD should be an error - you can't run a command interactively against multiple services.

@osteenbergen

Copy link
Copy Markdown
Author

Aanan, thanks for your comments and I will integrate them as soon as possible

  1. I named it execute as exec is a python build in command, will change it
  2. --all was my first version although it became difficult to distinguish between:
    docker-compose exec apache2 ps aux and docker-compose exec apache2. But I have just thought of a simple solution, so no problem there
  3. Interactive is a bit wierd as discussed in: Support docker exec command #593 (comment) Although I can limit it to a service with one container. Need to look into dockerpty on how to support the terminals. -i & -t are not a problem as they exist in the docker-py execute command

@ghost

Copy link
Copy Markdown

Agree that interactive is a little weird.

I understand that docker images with SSH are not really the way to go, but if you really want interactivity on multiple machines, something like SSH + clusterssh (or similar projects) are probably the way to go.

all is now an options (--all)
Renamed long_running to long-running so all folders have the same name convention
exec is a python reserved word so needed to change docopt_command to allow for reserved words.
Signed-off-by: Onno Steenbergen <onno@steenbe.nl>
@osteenbergen

Copy link
Copy Markdown
Author

Point 1 & 2 are integrated.

It seems that the Jenkins build bot has an error.

 docker build --rm --force-rm -t compose:docker-compose:3951ce4 .
time="2015-03-27T16:40:06-04:00" level=fatal msg="Invalid repository name (compose:docker-compose), only [a-z0-9-_.] are allowed"

About the commit itself:

Due to the way docopt works my only way to have --all was to write the usage line as
Usage: exec [options] [ SERVICE CMD... | CMD... ]

Other combinations (Usage: exec [options] [SERVICE] CMD...) could not handle single commands on all services.

$ docker-compose exec --all ps

@aanand

Copy link
Copy Markdown

I think that if there are multiple containers for a service running, Compose should either refuse to run exec or pick an arbitrary container.

Thinking about it, execing on multiple services (and, by extension, exec --all) is not an MVP feature. Since it complicates things like command parsing, I think it'd be better to just remove it.

@osteenbergen

Copy link
Copy Markdown
Author

I do not agree that compose exec should always run on a single container, unless you were talking about the interactive option.

The idea is to have a service (or system with --all) in a predictable state, executing a command on a single worker could result in different behaviour. Over time this will lead to an unstable system.

The use-case of exec is to inspect or to fix a small problem in a live environment. If for example the next heartbleed happens and you want to update all certificates with a gracefull restart you can do: compose exec apache apachectl -k graceful. However maybe the compose consist of apache image for serving content and a service using apache image for loadbalanding. Then the same command can be execute on both services.

I agree that there aren't many use cases, but we can't predict the usage of compose. Maybe some user like to have an arbitrary container, which can be solved by a --pick-random option. However I understand that we should not complicate stuff by jamming a lot of features into compose.

For parsing the output we could add a output folder option. This will create a separate file for every container running in the service/system.

@aanand

Copy link
Copy Markdown

I can believe there are a few good use cases for running an exec on all containers for a service, although doing an upgrade is a bad one - you should be updating your image and restarting your containers for that. Running some kind of diagnostic command is a good one.

But Compose isn't (yet) a tool for production environments, and so there isn't a strong need for that feature now. What would be useful, right now, is a command for inspecting a running container - an analogue to docker exec -it that doesn't require you to type a full service name.

@osteenbergen

Copy link
Copy Markdown
Author

Will work on that (need to add support for exec in dockerpty). As soon as that is finished and pulled I will update this pull.

@mattes

Copy link
Copy Markdown

+1

@mcortinas

Copy link
Copy Markdown

+1

1 similar comment
@antono

Copy link
Copy Markdown

+1

@aanand

Copy link
Copy Markdown

Closing as #2023 is the direction we're going in - thanks for the PR!

@aanandaanand closed this Dec 17, 2015
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@osteenbergen@Vrakfall@aanand@mattes@mcortinas@antono@dnephin
, '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); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Added "docker exec" command for a service or all services. - #1180

Closed
osteenbergen wants to merge 2 commits into
docker:masterfrom
osteenbergen:execute
Closed

Added "docker exec" command for a service or all services. #1180
osteenbergen wants to merge 2 commits into
docker:masterfrom
osteenbergen:execute

Conversation

@osteenbergen

Copy link
Copy Markdown

Example:

$ docker-compose execute busybox echo "Hello World!"

Supports --detach for background running
Supports running command on all containers with:

$ docker-compose execute all echo "Hello World!"
----- busy_busybox_1-----
Hello World!
----- busy_busybox2_1 -----
Hello World!
----- busy_busybox2_2 -----
Hello World!

Example:
$ docker-compose execute web echo "Hello World!"
Supports --detach for background running
Supports running command on all containers with:
$ docker-compose execute all echo "Hello World!"
Signed-off-by: Onno Steenbergen <onno@steenbe.nl>
@ghost

Copy link
Copy Markdown

That sounds awesome, +1 for merging it!

@Vrakfall

Copy link
Copy Markdown

+1

@aanand

Copy link
Copy Markdown

Thanks for contributing!

  1. The command should be called exec, not execute, to keep consistency with docker exec.
  2. all is a cool feature, but it should be a flag (i.e. --all), not a positional argument. Using --all alongside any service names should be an error.
  3. exec should be interactive - we should use dockerpty to attach to the process. This might require changes to dockerpty or docker-py.

@aanand

Copy link
Copy Markdown

Oh, and:

  • The -i and -t flags should be supported, just as with docker exec.
  • docker-compose exec -i --all CMD or docker-compose exec web db CMD should be an error - you can't run a command interactively against multiple services.

@osteenbergen

Copy link
Copy Markdown
Author

Aanan, thanks for your comments and I will integrate them as soon as possible

  1. I named it execute as exec is a python build in command, will change it
  2. --all was my first version although it became difficult to distinguish between:
    docker-compose exec apache2 ps aux and docker-compose exec apache2. But I have just thought of a simple solution, so no problem there
  3. Interactive is a bit wierd as discussed in: Support docker exec command #593 (comment) Although I can limit it to a service with one container. Need to look into dockerpty on how to support the terminals. -i & -t are not a problem as they exist in the docker-py execute command

@ghost

Copy link
Copy Markdown

Agree that interactive is a little weird.

I understand that docker images with SSH are not really the way to go, but if you really want interactivity on multiple machines, something like SSH + clusterssh (or similar projects) are probably the way to go.

all is now an options (--all)
Renamed long_running to long-running so all folders have the same name convention
exec is a python reserved word so needed to change docopt_command to allow for reserved words.
Signed-off-by: Onno Steenbergen <onno@steenbe.nl>
@osteenbergen

Copy link
Copy Markdown
Author

Point 1 & 2 are integrated.

It seems that the Jenkins build bot has an error.

 docker build --rm --force-rm -t compose:docker-compose:3951ce4 .
time="2015-03-27T16:40:06-04:00" level=fatal msg="Invalid repository name (compose:docker-compose), only [a-z0-9-_.] are allowed"

About the commit itself:

Due to the way docopt works my only way to have --all was to write the usage line as
Usage: exec [options] [ SERVICE CMD... | CMD... ]

Other combinations (Usage: exec [options] [SERVICE] CMD...) could not handle single commands on all services.

$ docker-compose exec --all ps

@aanand

Copy link
Copy Markdown

I think that if there are multiple containers for a service running, Compose should either refuse to run exec or pick an arbitrary container.

Thinking about it, execing on multiple services (and, by extension, exec --all) is not an MVP feature. Since it complicates things like command parsing, I think it'd be better to just remove it.

@osteenbergen

Copy link
Copy Markdown
Author

I do not agree that compose exec should always run on a single container, unless you were talking about the interactive option.

The idea is to have a service (or system with --all) in a predictable state, executing a command on a single worker could result in different behaviour. Over time this will lead to an unstable system.

The use-case of exec is to inspect or to fix a small problem in a live environment. If for example the next heartbleed happens and you want to update all certificates with a gracefull restart you can do: compose exec apache apachectl -k graceful. However maybe the compose consist of apache image for serving content and a service using apache image for loadbalanding. Then the same command can be execute on both services.

I agree that there aren't many use cases, but we can't predict the usage of compose. Maybe some user like to have an arbitrary container, which can be solved by a --pick-random option. However I understand that we should not complicate stuff by jamming a lot of features into compose.

For parsing the output we could add a output folder option. This will create a separate file for every container running in the service/system.

@aanand

Copy link
Copy Markdown

I can believe there are a few good use cases for running an exec on all containers for a service, although doing an upgrade is a bad one - you should be updating your image and restarting your containers for that. Running some kind of diagnostic command is a good one.

But Compose isn't (yet) a tool for production environments, and so there isn't a strong need for that feature now. What would be useful, right now, is a command for inspecting a running container - an analogue to docker exec -it that doesn't require you to type a full service name.

@osteenbergen

Copy link
Copy Markdown
Author

Will work on that (need to add support for exec in dockerpty). As soon as that is finished and pulled I will update this pull.

@mattes

Copy link
Copy Markdown

+1

@mcortinas

Copy link
Copy Markdown

+1

1 similar comment
@antono

Copy link
Copy Markdown

+1

@aanand

Copy link
Copy Markdown

Closing as #2023 is the direction we're going in - thanks for the PR!

@aanandaanand closed this Dec 17, 2015
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@osteenbergen@Vrakfall@aanand@mattes@mcortinas@antono@dnephin
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Added "docker exec" command for a service or all services. - #1180

Closed
osteenbergen wants to merge 2 commits into
docker:masterfrom
osteenbergen:execute
Closed

Added "docker exec" command for a service or all services. #1180
osteenbergen wants to merge 2 commits into
docker:masterfrom
osteenbergen:execute

Conversation

@osteenbergen

Copy link
Copy Markdown

Example:

$ docker-compose execute busybox echo "Hello World!"

Supports --detach for background running
Supports running command on all containers with:

$ docker-compose execute all echo "Hello World!"
----- busy_busybox_1-----
Hello World!
----- busy_busybox2_1 -----
Hello World!
----- busy_busybox2_2 -----
Hello World!

Example:
$ docker-compose execute web echo "Hello World!"
Supports --detach for background running
Supports running command on all containers with:
$ docker-compose execute all echo "Hello World!"
Signed-off-by: Onno Steenbergen <onno@steenbe.nl>
@ghost

Copy link
Copy Markdown

That sounds awesome, +1 for merging it!

@Vrakfall

Copy link
Copy Markdown

+1

@aanand

Copy link
Copy Markdown

Thanks for contributing!

  1. The command should be called exec, not execute, to keep consistency with docker exec.
  2. all is a cool feature, but it should be a flag (i.e. --all), not a positional argument. Using --all alongside any service names should be an error.
  3. exec should be interactive - we should use dockerpty to attach to the process. This might require changes to dockerpty or docker-py.

@aanand

Copy link
Copy Markdown

Oh, and:

  • The -i and -t flags should be supported, just as with docker exec.
  • docker-compose exec -i --all CMD or docker-compose exec web db CMD should be an error - you can't run a command interactively against multiple services.

@osteenbergen

Copy link
Copy Markdown
Author

Aanan, thanks for your comments and I will integrate them as soon as possible

  1. I named it execute as exec is a python build in command, will change it
  2. --all was my first version although it became difficult to distinguish between:
    docker-compose exec apache2 ps aux and docker-compose exec apache2. But I have just thought of a simple solution, so no problem there
  3. Interactive is a bit wierd as discussed in: Support docker exec command #593 (comment) Although I can limit it to a service with one container. Need to look into dockerpty on how to support the terminals. -i & -t are not a problem as they exist in the docker-py execute command

@ghost

Copy link
Copy Markdown

Agree that interactive is a little weird.

I understand that docker images with SSH are not really the way to go, but if you really want interactivity on multiple machines, something like SSH + clusterssh (or similar projects) are probably the way to go.

all is now an options (--all)
Renamed long_running to long-running so all folders have the same name convention
exec is a python reserved word so needed to change docopt_command to allow for reserved words.
Signed-off-by: Onno Steenbergen <onno@steenbe.nl>
@osteenbergen

Copy link
Copy Markdown
Author

Point 1 & 2 are integrated.

It seems that the Jenkins build bot has an error.

 docker build --rm --force-rm -t compose:docker-compose:3951ce4 .
time="2015-03-27T16:40:06-04:00" level=fatal msg="Invalid repository name (compose:docker-compose), only [a-z0-9-_.] are allowed"

About the commit itself:

Due to the way docopt works my only way to have --all was to write the usage line as
Usage: exec [options] [ SERVICE CMD... | CMD... ]

Other combinations (Usage: exec [options] [SERVICE] CMD...) could not handle single commands on all services.

$ docker-compose exec --all ps

@aanand

Copy link
Copy Markdown

I think that if there are multiple containers for a service running, Compose should either refuse to run exec or pick an arbitrary container.

Thinking about it, execing on multiple services (and, by extension, exec --all) is not an MVP feature. Since it complicates things like command parsing, I think it'd be better to just remove it.

@osteenbergen

Copy link
Copy Markdown
Author

I do not agree that compose exec should always run on a single container, unless you were talking about the interactive option.

The idea is to have a service (or system with --all) in a predictable state, executing a command on a single worker could result in different behaviour. Over time this will lead to an unstable system.

The use-case of exec is to inspect or to fix a small problem in a live environment. If for example the next heartbleed happens and you want to update all certificates with a gracefull restart you can do: compose exec apache apachectl -k graceful. However maybe the compose consist of apache image for serving content and a service using apache image for loadbalanding. Then the same command can be execute on both services.

I agree that there aren't many use cases, but we can't predict the usage of compose. Maybe some user like to have an arbitrary container, which can be solved by a --pick-random option. However I understand that we should not complicate stuff by jamming a lot of features into compose.

For parsing the output we could add a output folder option. This will create a separate file for every container running in the service/system.

@aanand

Copy link
Copy Markdown

I can believe there are a few good use cases for running an exec on all containers for a service, although doing an upgrade is a bad one - you should be updating your image and restarting your containers for that. Running some kind of diagnostic command is a good one.

But Compose isn't (yet) a tool for production environments, and so there isn't a strong need for that feature now. What would be useful, right now, is a command for inspecting a running container - an analogue to docker exec -it that doesn't require you to type a full service name.

@osteenbergen

Copy link
Copy Markdown
Author

Will work on that (need to add support for exec in dockerpty). As soon as that is finished and pulled I will update this pull.

@mattes

Copy link
Copy Markdown

+1

@mcortinas

Copy link
Copy Markdown

+1

1 similar comment
@antono

Copy link
Copy Markdown

+1

@aanand

Copy link
Copy Markdown

Closing as #2023 is the direction we're going in - thanks for the PR!

@aanandaanand closed this Dec 17, 2015
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@osteenbergen@Vrakfall@aanand@mattes@mcortinas@antono@dnephin