Convert slides to PDF via container fails on headless linux
Hi there,
i recently wanted to create PDFs of my markdown slides via my headless linux server (No X11, no Wayland, no locally installed Browser).
But running the container fails with some strange pupeteer error:
$ docker run --rm -v $PWD:/home/marp/app/ -e LANG=$LANG -e MARP_USER="$(id -u):$(id -g)" marpteam/marp-cli:v4.2.3 slide.md --pdf
[ INFO ] Converting 1 markdown...
/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/common/CallbackRegistry.js:81
this._reject(callback, new Errors_js_1.TargetCloseError('Target closed'));
^
TargetCloseError: Protocol error (Target.setDiscoverTargets): Target closed
at CallbackRegistry.clear (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/common/CallbackRegistry.js:81:36)
at #onClose (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Connection.js:179:25)
at Socket.<anonymous> (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/node/PipeTransport.js:29:30)
at Socket.emit (node:events:530:35)
at Pipe.<anonymous> (node:net:351:12) {
cause: ProtocolError
at <instance_members_initializer> (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/common/CallbackRegistry.js:102:14)
at new Callback (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/common/CallbackRegistry.js:106:16)
at CallbackRegistry.create (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/common/CallbackRegistry.js:24:26)
at Connection._rawSend (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Connection.js:99:26)
at Connection.send (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Connection.js:90:21)
at TargetManager.initialize (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/TargetManager.js:97:32)
at CdpBrowser._attach (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Browser.js:70:35)
at CdpBrowser._create (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Browser.js:26:23)
at ChromeLauncher.launch (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserLauncher.js:157:61)
at async n (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:4129)
}
Node.js v22.15.0
Some information about my System:
- Linux: Ubuntun 22.04, Kernel 5.15.0-161-generic
- Docker:
Docker version 28.2.2, build 28.2.2-0ubuntu1~22.04.1 - Marp Image:
docker.io/marpteam/marp-cli:v4.2.3 (sha256:50dd4d893128fd5d9e2e5da77f0f2733ef6a0918d619a00d32238c59c9bdee5e)
The same command runs on my local machine (CachyOS and Ubuntu 24.04). That's why i suspect it has to do something with the headless linux environment? Or is it about Ubuntu 22.04?
Target closed error on Target.setDiscoverTargets command in Puppeteer usually indicates that the browser (within the container image, not locally installed browser) has been crashed unexpectedly. It may be caused by out of memory for the container.
- Check Docker's memory settings, and set
--memoryand similar memory options +--oom-kill-disableas needed. - If you're running the container on the environment that has limited memory and storage usage like AWS Lambda, you may have to create a custom image that has included a lightweight Chromium such as
@sparticuz/chromium. - You can add
--debug=alloption for more detailed logs, including Puppeteer.
I checked this, but it does not seem to be the case that it is a memory issue.
Checking the OOMKilled property of docker inspect returns false. And i cannot find something in dmesg that would indicate that the OOMKiller ran...
Running the Container with lots of Memory (10G) gives the same result for me. (Even running it with only 100MB produces the same output).
I post the result of the latest run with --debug=all
docker run -v $PWD:/home/marp/app/ -e LANG=$LANG -e MARP_USER="$(id -u):$(id -g)" --memory=10G marpteam/marp-cli:v4.2.3 slide.md --pdf --debug=all
2025-12-09T14:12:51.209Z portfinder:defaultHosts exports._defaultHosts is: [ '0.0.0.0', '127.0.0.1', '::1', '172.17.0.2', null ]
[ INFO ] Debug logging is enabled. (Filter pattern: *)
2025-12-09T14:12:51.224Z marp-cli:config Passed arguments: { baseUrl: undefined, _: [ 'slide.md' ], pdf: true, stdin: true, '$0': '../.cli/marp-cli.js' }
2025-12-09T14:12:51.225Z marp-cli:config Finding configuration file from current directory: /home/marp/app
2025-12-09T14:12:51.229Z marp-cli:config No configuration file found.
2025-12-09T14:12:51.232Z marp-cli:engine Failed to import @marp-team/marp-core. (Normalized module id: @marp-team/marp-core)
2025-12-09T14:12:51.232Z marp-cli:engine Error: Cannot find package '@marp-team/marp-core' imported from /home/marp/app/_.js
at __node_internal_ (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:86071)
at new <anonymous> (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:82038)
at ki (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:95584)
at Bi (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:96884)
at xi (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:98815)
at /home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:100903
at Ti._silentImport (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:101068)
at async Ti.resolveModule (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:99605)
at async Ti.resolve (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:99059)
at async Ti.resolveDefaultEngine (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:99178)
at async fromArguments (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:48:157771)
at async Jp (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:48:186001) {
code: 'ERR_MODULE_NOT_FOUND'
}
2025-12-09T14:12:51.416Z marp-cli:browser Browser manager configured: { finders: undefined, path: undefined, protocol: 'cdp', timeout: undefined }
2025-12-09T14:12:51.418Z marp-cli Reading stdin stream...
2025-12-09T14:12:51.420Z marp-cli Read from stdin: 0 bytes
[ INFO ] Converting 1 markdown...
2025-12-09T14:12:51.422Z marp-cli [Worker 1] Start processing ...
2025-12-09T14:12:51.422Z marp-cli [Worker 1] Processing /home/marp/app/slide.md ...
2025-12-09T14:12:51.422Z marp-cli Converting slide.md ...
2025-12-09T14:12:51.422Z marp-cli [Worker 2] Start processing ...
2025-12-09T14:12:51.422Z marp-cli [Worker 2] Finish processing.
2025-12-09T14:12:51.422Z marp-cli [Worker 3] Start processing ...
2025-12-09T14:12:51.422Z marp-cli [Worker 3] Finish processing.
2025-12-09T14:12:51.422Z marp-cli [Worker 4] Start processing ...
2025-12-09T14:12:51.422Z marp-cli [Worker 4] Finish processing.
2025-12-09T14:12:51.422Z marp-cli [Worker 5] Start processing ...
2025-12-09T14:12:51.422Z marp-cli [Worker 5] Finish processing.
2025-12-09T14:12:51.423Z marp-cli:browser:finder Start finding browser from chrome, edge, firefox ({ preferredPath: undefined })
2025-12-09T14:12:51.426Z marp-cli:browser:finder Found chrome: { path: '/usr/local/bin/chrome', acceptedBrowsers: [ [class ar extends sr] { kind: 'chrome', protocol: 'webDriverBiDi' }, [class ur extends ar] { protocol: 'cdp' } ] }
2025-12-09T14:12:51.426Z marp-cli:browser:finder Use browser: { path: '/usr/local/bin/chrome', acceptedBrowsers: [ [class ar extends sr] { kind: 'chrome', protocol: 'webDriverBiDi' }, [class ur extends ar] { protocol: 'cdp' } ] }
2025-12-09T14:12:51.426Z marp-cli:browser Use browser class for conversion: [class ur extends ar] { protocol: 'cdp' }
2025-12-09T14:12:51.541Z marp-cli:browser Launching browser via Puppeteer...
2025-12-09T14:12:51.543Z marp-cli CLIError: Edge browser could not be found.
at he (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:1:8258)
at edge (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:46905) {
errorCode: 2
}
2025-12-09T14:12:51.543Z marp-cli:browser Created data directory: /tmp/marp-cli-T2Djhz4_cf
2025-12-09T14:12:51.545Z puppeteer:browsers:launcher Launching /usr/local/bin/chrome --allow-pre-commit-input --disable-background-networking --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-breakpad --disable-client-side-phishing-detection --disable-component-extensions-with-background-pages --disable-crash-reporter --disable-default-apps --disable-dev-shm-usage --disable-hang-monitor --disable-infobars --disable-ipc-flooding-protection --disable-popup-blocking --disable-prompt-on-repost --disable-renderer-backgrounding --disable-search-engine-choice-screen --disable-sync --enable-automation --export-tagged-pdf --force-color-profile=srgb --generate-pdf-document-outline --metrics-recording-only --no-first-run --password-store=basic --use-mock-keychain --disable-features=Translate,AcceptCHFrame,MediaRouter,OptimizationHints,ProcessPerSiteUpToMainFrameThreshold,IsolateSandboxedIframes --enable-features=PdfOopif --headless=new --hide-scrollbars --mute-audio --disable-extensions about:blank --user-data-dir=/tmp/marp-cli-T2Djhz4_cf --disable-component-update --test-type --no-sandbox --remote-debugging-pipe {
detached: true,
env: {},
stdio: [ 'ignore', 'ignore', 'ignore', 'pipe', 'pipe' ]
}
2025-12-09T14:12:51.547Z puppeteer:browsers:launcher Launched 22
2025-12-09T14:12:51.550Z puppeteer:protocol:SEND ► [
'{"method":"Target.setDiscoverTargets","params":{"discover":true,"filter":[{}]},"id":1}'
]
2025-12-09T14:12:51.552Z marp-cli CLIError: Firefox browser could not be found.
at he (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:1:8258)
at firefox (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:48363) {
errorCode: 2
}
2025-12-09T14:12:51.658Z puppeteer:error [
Error: read ECONNRESET
at Pipe.onStreamRead (node:internal/stream_base_commons:216:20) {
errno: -104,
code: 'ECONNRESET',
syscall: 'read'
}
]
2025-12-09T14:12:51.659Z puppeteer:error [
Error: Protocol error: Connection closed.
at Connection._rawSend (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Connection.js:97:35)
at Connection.send (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Connection.js:90:21)
at Connection.closeBrowser (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Connection.js:114:20)
at ChromeLauncher.closeBrowser (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserLauncher.js:190:37)
at browserCloseCallback (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserLauncher.js:121:24)
at ChromeLauncher.launch (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserLauncher.js:162:18)
at async n (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:4129)
at async ur.launchPuppeteer (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:4539)
at async ur.launchPuppeteer (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:5312)
at async /home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:2095
]
2025-12-09T14:12:51.659Z puppeteer:browsers:launcher Trying to kill 22
2025-12-09T14:12:51.659Z puppeteer:browsers:launcher Browser process 22 exists
/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/common/CallbackRegistry.js:81
this._reject(callback, new Errors_js_1.TargetCloseError('Target closed'));
^
TargetCloseError: Protocol error (Target.setDiscoverTargets): Target closed
at CallbackRegistry.clear (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/common/CallbackRegistry.js:81:36)
at #onClose (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Connection.js:179:25)
at Socket.<anonymous> (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/node/PipeTransport.js:29:30)
at Socket.emit (node:events:530:35)
at Pipe.<anonymous> (node:net:351:12) {
cause: ProtocolError
at <instance_members_initializer> (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/common/CallbackRegistry.js:102:14)
at new Callback (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/common/CallbackRegistry.js:106:16)
at CallbackRegistry.create (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/common/CallbackRegistry.js:24:26)
at Connection._rawSend (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Connection.js:99:26)
at Connection.send (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Connection.js:90:21)
at TargetManager.initialize (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/TargetManager.js:97:32)
at CdpBrowser._attach (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Browser.js:70:35)
at CdpBrowser._create (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Browser.js:26:23)
at ChromeLauncher.launch (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserLauncher.js:157:61)
at async n (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:4129)
}
Node.js v22.15.0
My Linux-Server has 32GB of RAM and 27GB available.
Thanks to share detailed logs. read ECONNRESET error while connecting Puppeteer into browser through Target.setDiscoverTargets might be similar to https://github.com/marp-team/marp-cli/issues/287#issuecomment-692318928. In the other words, Ubuntu may prevent launching/usr/local/bin/chrome by AppArmor.
https://pptr.dev/troubleshooting#issues-with-apparmor-on-ubuntu
I'm not familiar with container technology, so I don't know if the host OS's protection features affect the container's guest OS. However, if it works fine on other host OSs, I think it might be safe to assume the problem lies with the host OS. I've tested docker.io/marpteam/marp-cli:v4.2.3 image on ARM64 macOS and it works.
How about setting the CHROME_NO_SANDBOX environment variable as 1 explicitly?
-e CHROME_NO_SANDBOX=1
The sandbox should be automatically disabled in Docker environments to bypass AppArmor restrictions (#543, #544), but perhaps there are cases where this does not happen.
Regarding AppArmor: According to the linked documentation this is only a issue in Ubuntu 23.10 and onwards. But my server is still on 22.04. After looking into the logs i also could not find anything related to AppArmor preventing the launch of chrome.
Adding -e CHROME_NO_SANDBOX=1 doesn't seem to change anything...
$ docker run -v $PWD:/home/marp/app/ -e LANG=$LANG -e MARP_USER="$(id -u):$(id -g)" -e CHROME_NO_SANDBOX=1 marpteam/marp-cli:v4.2.3 slide.md --pdf --debug=all
2025-12-10T10:59:21.283Z portfinder:defaultHosts exports._defaultHosts is: [ '0.0.0.0', '127.0.0.1', '::1', '172.17.0.2', null ]
[ INFO ] Debug logging is enabled. (Filter pattern: *)
2025-12-10T10:59:21.301Z marp-cli:config Passed arguments: { baseUrl: undefined, _: [ 'slide.md' ], pdf: true, stdin: true, '$0': '../.cli/marp-cli.js' }
2025-12-10T10:59:21.302Z marp-cli:config Finding configuration file from current directory: /home/marp/app
2025-12-10T10:59:21.306Z marp-cli:config No configuration file found.
2025-12-10T10:59:21.307Z marp-cli:engine Failed to import @marp-team/marp-core. (Normalized module id: @marp-team/marp-core)
2025-12-10T10:59:21.308Z marp-cli:engine Error: Cannot find package '@marp-team/marp-core' imported from /home/marp/app/_.js
at __node_internal_ (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:86071)
at new <anonymous> (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:82038)
at ki (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:95584)
at Bi (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:96884)
at xi (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:98815)
at /home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:100903
at Ti._silentImport (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:101068)
at async Ti.resolveModule (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:99605)
at async Ti.resolve (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:99059)
at async Ti.resolveDefaultEngine (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:99178)
at async fromArguments (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:48:157771)
at async Jp (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:48:186001) {
code: 'ERR_MODULE_NOT_FOUND'
}
2025-12-10T10:59:21.492Z marp-cli:browser Browser manager configured: { finders: undefined, path: undefined, protocol: 'cdp', timeout: undefined }
2025-12-10T10:59:21.494Z marp-cli Reading stdin stream...
2025-12-10T10:59:21.496Z marp-cli Read from stdin: 0 bytes
[ INFO ] Converting 1 markdown...
2025-12-10T10:59:21.497Z marp-cli [Worker 1] Start processing ...
2025-12-10T10:59:21.497Z marp-cli [Worker 1] Processing /home/marp/app/slide.md ...
2025-12-10T10:59:21.498Z marp-cli Converting slide.md ...
2025-12-10T10:59:21.498Z marp-cli [Worker 2] Start processing ...
2025-12-10T10:59:21.498Z marp-cli [Worker 2] Finish processing.
2025-12-10T10:59:21.498Z marp-cli [Worker 3] Start processing ...
2025-12-10T10:59:21.498Z marp-cli [Worker 3] Finish processing.
2025-12-10T10:59:21.498Z marp-cli [Worker 4] Start processing ...
2025-12-10T10:59:21.498Z marp-cli [Worker 4] Finish processing.
2025-12-10T10:59:21.498Z marp-cli [Worker 5] Start processing ...
2025-12-10T10:59:21.498Z marp-cli [Worker 5] Finish processing.
2025-12-10T10:59:21.499Z marp-cli:browser:finder Start finding browser from chrome, edge, firefox ({ preferredPath: undefined })
2025-12-10T10:59:21.501Z marp-cli:browser:finder Found chrome: { path: '/usr/local/bin/chrome', acceptedBrowsers: [ [class ar extends sr] { kind: 'chrome', protocol: 'webDriverBiDi' }, [class ur extends ar] { protocol: 'cdp' } ] }
2025-12-10T10:59:21.502Z marp-cli:browser:finder Use browser: { path: '/usr/local/bin/chrome', acceptedBrowsers: [ [class ar extends sr] { kind: 'chrome', protocol: 'webDriverBiDi' }, [class ur extends ar] { protocol: 'cdp' } ] }
2025-12-10T10:59:21.502Z marp-cli:browser Use browser class for conversion: [class ur extends ar] { protocol: 'cdp' }
2025-12-10T10:59:21.614Z marp-cli:browser Launching browser via Puppeteer...
2025-12-10T10:59:21.616Z marp-cli CLIError: Edge browser could not be found.
at he (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:1:8258)
at edge (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:46905) {
errorCode: 2
}
2025-12-10T10:59:21.616Z marp-cli:browser Created data directory: /tmp/marp-cli-11a9CZXp_X
2025-12-10T10:59:21.618Z puppeteer:browsers:launcher Launching /usr/local/bin/chrome --allow-pre-commit-input --disable-background-networking --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-breakpad --disable-client-side-phishing-detection --disable-component-extensions-with-background-pages --disable-crash-reporter --disable-default-apps --disable-dev-shm-usage --disable-hang-monitor --disable-infobars --disable-ipc-flooding-protection --disable-popup-blocking --disable-prompt-on-repost --disable-renderer-backgrounding --disable-search-engine-choice-screen --disable-sync --enable-automation --export-tagged-pdf --force-color-profile=srgb --generate-pdf-document-outline --metrics-recording-only --no-first-run --password-store=basic --use-mock-keychain --disable-features=Translate,AcceptCHFrame,MediaRouter,OptimizationHints,ProcessPerSiteUpToMainFrameThreshold,IsolateSandboxedIframes --enable-features=PdfOopif --headless=new --hide-scrollbars --mute-audio --disable-extensions about:blank --user-data-dir=/tmp/marp-cli-11a9CZXp_X --disable-component-update --test-type --no-sandbox --remote-debugging-pipe {
detached: true,
env: {},
stdio: [ 'ignore', 'ignore', 'ignore', 'pipe', 'pipe' ]
}
2025-12-10T10:59:21.620Z puppeteer:browsers:launcher Launched 22
2025-12-10T10:59:21.622Z puppeteer:protocol:SEND ► [
'{"method":"Target.setDiscoverTargets","params":{"discover":true,"filter":[{}]},"id":1}'
]
2025-12-10T10:59:21.624Z marp-cli CLIError: Firefox browser could not be found.
at he (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:1:8258)
at firefox (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:48363) {
errorCode: 2
}
2025-12-10T10:59:21.730Z puppeteer:error [
Error: read ECONNRESET
at Pipe.onStreamRead (node:internal/stream_base_commons:216:20) {
errno: -104,
code: 'ECONNRESET',
syscall: 'read'
}
]
2025-12-10T10:59:21.731Z puppeteer:error [
Error: Protocol error: Connection closed.
at Connection._rawSend (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Connection.js:97:35)
at Connection.send (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Connection.js:90:21)
at Connection.closeBrowser (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Connection.js:114:20)
at ChromeLauncher.closeBrowser (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserLauncher.js:190:37)
at browserCloseCallback (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserLauncher.js:121:24)
at ChromeLauncher.launch (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserLauncher.js:162:18)
at async n (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:4129)
at async ur.launchPuppeteer (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:4539)
at async ur.launchPuppeteer (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:5312)
at async /home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:2095
]
2025-12-10T10:59:21.731Z puppeteer:browsers:launcher Trying to kill 22
2025-12-10T10:59:21.731Z puppeteer:browsers:launcher Browser process 22 exists
/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/common/CallbackRegistry.js:81
this._reject(callback, new Errors_js_1.TargetCloseError('Target closed'));
^
TargetCloseError: Protocol error (Target.setDiscoverTargets): Target closed
at CallbackRegistry.clear (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/common/CallbackRegistry.js:81:36)
at #onClose (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Connection.js:179:25)
at Socket.<anonymous> (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/node/PipeTransport.js:29:30)
at Socket.emit (node:events:530:35)
at Pipe.<anonymous> (node:net:351:12) {
cause: ProtocolError
at <instance_members_initializer> (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/common/CallbackRegistry.js:102:14)
at new Callback (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/common/CallbackRegistry.js:106:16)
at CallbackRegistry.create (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/common/CallbackRegistry.js:24:26)
at Connection._rawSend (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Connection.js:99:26)
at Connection.send (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Connection.js:90:21)
at TargetManager.initialize (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/TargetManager.js:97:32)
at CdpBrowser._attach (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Browser.js:70:35)
at CdpBrowser._create (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Browser.js:26:23)
at ChromeLauncher.launch (/home/marp/.cli/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserLauncher.js:157:61)
at async n (/home/marp/.cli/lib/marp-cli-CBvmXjya.js:18:4129)
}
Node.js v22.15.0
According to the logs, Chrome loses connection with Marp after it finishes launching. Therefore, it might be best to first verify whether Chrome is running correctly within the container.
The following command will output the content of https://example.com to output.pdf using Chrome in the container. If Chrome is functioning correctly, it should produce output.pdf.
docker run -v $PWD:/home/marp/app/ -e LANG=$LANG --entrypoint "" marpteam/marp-cli:v4.2.3 /usr/local/bin/chrome --headless --print-to-pdf https://example.com
https://developer.chrome.com/docs/chromium/headless#--print-to-pdf
Running your command fails:
$ docker run -v $PWD:/home/marp/app/ -e LANG=$LANG --entrypoint "" marpteam/marp-cli:v4.2.3 /usr/local/bin/chrome --headless --print-to-pdf https://example.com
[1:1:1214/213448.632876:ERROR:content/browser/zygote_host/zygote_host_impl_linux.cc:105] Running as root without --no-sandbox is not supported. See https://crbug.com/638180.
But adding the suggested --no-sandbox to the command works
$ docker run -v $PWD:/home/marp/app/ -e LANG=$LANG --entrypoint "" marpteam/marp-cli:v4.2.3 /usr/local/bin/chrome --no-sandbox --headless --print-to-pdf https://example.com
[1:21:1214/213818.927189:ERROR:dbus/bus.cc:408] Failed to connect to the bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
[1:24:1214/213818.932046:ERROR:dbus/bus.cc:408] Failed to connect to the bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
[1:24:1214/213818.932156:ERROR:dbus/bus.cc:408] Failed to connect to the bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
[1:21:1214/213818.941166:ERROR:dbus/bus.cc:408] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
[1:21:1214/213818.941302:ERROR:dbus/bus.cc:408] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
[1:21:1214/213818.941354:ERROR:dbus/bus.cc:408] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
[1:21:1214/213818.941414:ERROR:dbus/bus.cc:408] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
[1:21:1214/213818.941771:ERROR:dbus/bus.cc:408] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
[1:21:1214/213819.107532:ERROR:dbus/bus.cc:408] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
(process:1): GLib-GIO-CRITICAL **: 21:38:19.153: g_settings_schema_source_lookup: assertion 'source != NULL' failed
[1:1:1214/213819.232515:ERROR:dbus/object_proxy.cc:590] Failed to call method: org.freedesktop.DBus.NameHasOwner: object_path= /org/freedesktop/DBus: unknown error type:
[1:1:1214/213819.232619:ERROR:dbus/object_proxy.cc:590] Failed to call method: org.freedesktop.DBus.NameHasOwner: object_path= /org/freedesktop/DBus: unknown error type:
[1:21:1214/213819.232777:ERROR:dbus/bus.cc:408] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
[1:21:1214/213819.232823:ERROR:dbus/bus.cc:408] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
[1:1:1214/213819.243173:ERROR:dbus/object_proxy.cc:590] Failed to call method: org.freedesktop.DBus.NameHasOwner: object_path= /org/freedesktop/DBus: unknown error type:
[1:1:1214/213819.259901:ERROR:dbus/object_proxy.cc:590] Failed to call method: org.freedesktop.DBus.NameHasOwner: object_path= /org/freedesktop/DBus: unknown error type:
[1:1:1214/213819.259977:ERROR:dbus/object_proxy.cc:590] Failed to call method: org.freedesktop.DBus.NameHasOwner: object_path= /org/freedesktop/DBus: unknown error type:
[1:104:1214/213819.260035:ERROR:dbus/bus.cc:408] Failed to connect to the bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
[1:104:1214/213819.260116:ERROR:dbus/bus.cc:408] Failed to connect to the bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
[1:104:1214/213819.260262:ERROR:dbus/bus.cc:408] Failed to connect to the bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
[1:21:1214/213819.260334:ERROR:dbus/bus.cc:408] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
[1:104:1214/213819.260422:ERROR:dbus/bus.cc:408] Failed to connect to the bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
[1:104:1214/213819.260487:ERROR:dbus/bus.cc:408] Failed to connect to the bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
[1:1:1214/213819.271126:ERROR:dbus/object_proxy.cc:590] Failed to call method: org.freedesktop.DBus.NameHasOwner: object_path= /org/freedesktop/DBus: unknown error type:
[1:17:1214/213819.340678:ERROR:dbus/bus.cc:408] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
[1:1:1214/213819.414816:ERROR:dbus/object_proxy.cc:590] Failed to call method: org.freedesktop.DBus.NameHasOwner: object_path= /org/freedesktop/DBus: unknown error type:
[1:18:1214/213819.415013:ERROR:dbus/bus.cc:408] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
[1:1:1214/213819.423324:ERROR:dbus/object_proxy.cc:590] Failed to call method: org.freedesktop.DBus.NameHasOwner: object_path= /org/freedesktop/DBus: unknown error type:
[1:19:1214/213819.423463:ERROR:dbus/bus.cc:408] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
[1:1:1214/213819.426132:ERROR:dbus/object_proxy.cc:590] Failed to call method: org.freedesktop.DBus.NameHasOwner: object_path= /org/freedesktop/DBus: unknown error type:
[1:19:1214/213819.426282:ERROR:dbus/bus.cc:408] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
[1:1:1214/213819.431828:ERROR:dbus/object_proxy.cc:590] Failed to call method: org.freedesktop.DBus.NameHasOwner: object_path= /org/freedesktop/DBus: unknown error type:
[1:18:1214/213819.432037:ERROR:dbus/bus.cc:408] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
[1:1:1214/213819.442353:ERROR:dbus/object_proxy.cc:590] Failed to call method: org.freedesktop.DBus.NameHasOwner: object_path= /org/freedesktop/DBus: unknown error type:
10914 bytes written to file output.pdf
Confirming that I'm seeing the issue too. Tried both on my work system (RHEL 9 EC2 instance with SELinux enabled, using docker) as well as my home system (Bluefin, based on fedora Silverblue 42.20251209.1, also docker).
See the issue with any v4.x.x container image. Last version I can get to successfully build a non-html page (PDF, PPTX) is v3.4.0.
Both systems have gnome installed and running.
Thanks for your extra informations. Marp CLI had been used Alpine Linux as the base container image of until v3, but v4 has been updated the base image to Debian in #608, due to some troubles about Puppeteer brought by Alpine (https://pptr.dev/troubleshooting#running-on-alpine, https://github.com/marp-team/marp-cli/issues/592).
We are still open to insights that could lead to a solution.
Just checked and i see the same behavior as @mddeff. v3.4.0 works on my headless linux server. While starting from v4.0.0 i get errors (did not check all v4 tags though).