npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

n8n-nodes-docker-api

v1.0.0

Published

Interact with Docker via direct API (no Portainer required) — manage containers, stream logs, and automate infrastructure workflows

Readme

n8n Docker Node

🐳 n8n-nodes-docker-api

npm version npm downloads n8n community node License: MIT

Control Docker from your n8n workflows — 58 operations plus an event trigger, with output you can feed straight into an IF node.


✨ Why this node

No dependencies. Talks to the Docker Engine API directly over a socket, TCP or TLS. If you already run Portainer, it can go through that too — but nothing extra is required.

Output you can actually use. Docker's raw responses are verbose, deeply nested, and inconsistent between endpoints. Everything here is normalized to a flat, stable shape, and the same container looks the same whichever operation returned it.

// List Containers — one item
{
  "id": "e324df4bd041772cc01172d392a4c2faa87d63614b8c0d0ab859919cb9a84432",
  "shortId": "e324df4bd041",
  "name": "api-gateway",
  "image": "nginx:alpine",
  "status": "running",
  "health": "healthy",
  "createdAt": "2026-07-31T13:45:48.000Z",
  "ports": [{ "containerPort": 80, "hostPort": 8080, "protocol": "tcp" }],
  "labels": { "com.example.tier": "edge" }
}

Safe by default. Credentials carry an access mode, enforced at run time — not just hidden in the UI. Every destructive operation offers a dry run, and every prune shows you exactly what it would remove first.

It tells you when it doesn't know. An empty result always says whether it means nothing found or not looked up. Operations that cannot return complete information say so in the output rather than returning a confident half-answer.


📦 Install

Community Nodes (recommended)

Settings → Community Nodes → Install → n8n-nodes-docker-api

Manual

npm install n8n-nodes-docker-api

Requires a self-hosted n8n with access to a Docker daemon.


🚀 Quick start

  1. Add a Docker API credential and pick a connection mode
  2. Press Test Connection — it reports the daemon version on success
  3. Add the Docker API node, choose a resource and operation

Docker node


🔌 Connecting

| Mode | Use when | |---|---| | Unix Socket / Named Pipe | Docker runs on the same machine as n8n | | TCP | Remote daemon on a trusted private network | | TLS | Remote daemon, encrypted with client certificates | | Portainer | You already run Portainer and want to go through it |

The socket path defaults correctly for the host n8n is running on — /var/run/docker.sock on Linux and macOS, //./pipe/docker_engine on Windows.

Credentials

Access modes

Set on the credential and enforced at run time:

  • Read Only — listing, inspection, logs, stats. Write operations are refused with a clear message.
  • Full Control — everything.

Unrecognised operations are denied under Read Only rather than allowed, so a future addition can never quietly widen what a read-only credential can do.


📋 Operations

Containers (24)

| | | |---|---| | Read | List · Inspect · Get Logs · List Processes · Get Filesystem Changes · Get Stats | | Lifecycle | Create · Start · Stop · Restart · Kill · Pause · Unpause · Rename · Remove · Prune | | Files & state | Export · Copy From · Copy To · Get Path Info · Update (limits, restart policy) | | Beyond the API | Run (Ephemeral) · Execute Command · Wait For State |

Run Container (Ephemeral) creates, runs, captures output and removes — in one step. The container is cleaned up on every path, including timeout, so a workflow that fails midway never leaves one behind.

Execute Command returns { stdout, stderr, exitCode } from a single operation, with the two streams kept separate.

Create Container covers what a real deployment needs, not just the basics: health check, CPU and memory limits, capabilities, devices, extra hosts, DNS, shared memory size, tmpfs mounts, an init process, restart policy and network mode — alongside ports, volumes, environment and labels.

Wait For State blocks until a container is running, healthy or exited. Waiting on healthy is the piece every deploy-then-verify workflow needs, and Docker has no endpoint for it.

Get Logs returns structured lines with their stream of origin:

{ "logs": [ { "message": "listening on :8080", "stream": "stdout" },
            { "message": "upstream timeout",   "stream": "stderr" } ],
  "lineCount": 2, "tty": false }

Get Stats returns numbers people actually want — cpuPercent, memoryUsageMB, memoryPercent, networkRxMB — rather than Docker's raw cumulative counters.

Copy From / To Container moves files through n8n's binary data system, so they can be written to disk, uploaded, or attached like any other file.

Images (15)

List · Inspect · Get History · Search · Pull · Push · Tag · Remove · Prune · Build · Create From Container · Save · Load · Prune Build Cache · Get Registry Info

Build takes a Dockerfile as text for the common case, or a tar context when the build needs to COPY local files. Create From Container snapshots a running container as an image. Save and Load move images as tar archives through n8n binary data, for backups or air-gapped transfer. Prune Build Cache reclaims the builder cache, which image pruning never touches and which is often the largest recoverable space on a build machine.

Get Registry Info reads an image’s digest and platform list straight from the registry without pulling it — a few kilobytes instead of the whole image. Compare the digest against what is currently running to tell whether a rebuild is actually needed, or check a tag exists for your architecture before a deploy commits to it.

Pull and Push wait for completion and return a summary — layers, digest, status, duration — instead of a progress firehose or a stream that never ends.

Networks (7)

List · Inspect · Create · Connect Container · Disconnect Container · Remove · Prune

Volumes (5)

List · Inspect · Create · Remove · Prune

System (6)

Get Info · Get Version · Ping · Get Disk Usage · Get Events · Check Registry Credentials

Custom API Call

An escape hatch to any Docker Engine endpoint, for anything not covered above or a newer API than this release knows about. The response comes back exactly as Docker sent it and is marked normalized: false — the one operation that deliberately does not promise a stable shape.


⚡ Docker Trigger

Start a workflow when something happens in Docker.

Docker Trigger

Watches containers, images, networks, volumes and the daemon. Filter by event type, action, container, image or label — filters are applied by Docker, so only matching events are sent.

It catches up. Docker's event stream is live-only: connect, and you get what happens next and nothing earlier. If n8n restarts, a naive listener silently loses everything that happened in between — which is exactly when something worth knowing about tends to occur. This trigger remembers where it got to and replays from there, without ever delivering the same event twice.

It reconnects. Event streams die for ordinary reasons — daemon restarts, socket hiccups, a laptop sleeping. It reconnects with backoff rather than quietly stopping.


🔥 Real use cases

♻️ Self-healing containers

A container dies at 3am. Nobody is awake. It comes back by itself.

Docker Trigger (container · die)  →  IF (name = api-gateway)  →  Docker: Start Container

The trigger catches up on anything that happened while n8n itself was restarting, so a crash during a deploy window is not silently lost.

🚨 Alert before your users notice

Health status changes reach you before the support ticket does.

Docker Trigger (container · health_status)  →  IF (health = unhealthy)  →  Slack

🚢 Deploy and verify

Pull, replace, and wait for the new container to report healthy — not merely running, which is the difference between a deploy that worked and one that only looks like it did.

Docker: Get Registry Info  →  IF (digest changed)  →  Docker: Pull Image
   →  Docker: Remove Container  →  Docker: Create Container
   →  Docker: Wait For State (healthy)  →  Slack

Get Registry Info checks for a new version without downloading the image, so the schedule costs kilobytes on every day that nothing has changed.

🧪 Run a job in a disposable container

Schedule  →  Docker: Run Container (Ephemeral)  →  IF (exitCode = 0)  →  …

Nothing is left behind — the container is removed on every path, including timeout, so a workflow that fails midway never accumulates containers.

📊 Nightly disk report

Schedule  →  Docker: Get Disk Usage  →  Docker: Prune Images (Dry Run)  →  Email

The dry run reports exactly what would be reclaimed, so the report is informative without being destructive.


🩹 When the daemon goes away

Docker restarts. Sockets briefly lose their permissions. A proxy hiccups. These fail a workflow step that would have succeeded a second later.

Every request retries automatically on failures that never reached the daemon — ECONNREFUSED, a missing or unreadable socket, an unreachable host, or a 502/503/504 from a proxy in front of Docker. Three attempts with exponential backoff by default, configurable under Connection Retry.

Anything Docker actually answered is never retried. A missing container, a name conflict, a refused registry login — the daemon was reachable and gave a considered reply, so retrying would only bury a configuration problem under a delay.

A write is never repeated once it may have been applied. If the connection breaks after the request was sent, the daemon may already have created that container. Reads are retried; writes are not, and the error says the outcome is unknown rather than implying nothing happened.

Retries are per request, so an item that already succeeded is never re-run. This matters more than it sounds: n8n's built-in Retry On Fail re-executes the whole node, so a batch of fifty containers where the last one fails would create the first forty-nine again. Leave it off for this node.


🔒 Security

Access to the Docker daemon is equivalent to root on the host. That is true of any tool that talks to Docker, and worth stating plainly.

  • Use Read Only credentials unless a workflow genuinely needs to change things
  • Prefer TLS over plain TCP for anything crossing a network
  • Consider a socket proxy such as tecnativa/docker-socket-proxy to restrict which endpoints are reachable at all
  • Never expose the Docker daemon on a public interface

The credential UI carries this warning too, and Read Only is the default.


🗺️ Scope

This node covers containers, images, networks, volumes and system operations — the surface that automation workflows actually use.

Swarm mode (services, nodes, tasks, secrets, configs) and plugin management are deliberately out of scope. Teams running Swarm manage it with Swarm-native tooling rather than from workflow steps, and supporting it well would mean a large surface serving very few n8n users. Anything genuinely needed remains reachable through Custom API Call.


⭐ Contributing

Issues and pull requests are welcome — particularly bug reports with a reproducible workflow. See DEVELOPMENT.md for the local setup and test harness.

📄 License

MIT