|
269 | 269 | echo "extra services started" |
270 | 270 | exit 0 |
271 | 271 | ` |
272 | | - |
273 | | -// CHANGE: manage the Playwright browser as a nested Docker container owned by the project container. |
274 | | -// WHY: issue #306 follow-up requires browser containers to inherit project lifecycle while keeping separate limits. |
275 | | -// QUOTE(ТЗ): "пусть он поднимается внутри dg-issues1 а не где-то из вне" |
276 | | -// REF: issue-306-browser-nested-runtime |
277 | | -// SOURCE: n/a |
278 | | -// FORMAT THEOREM: start(main) -> running(browser) with network(browser) = container:main OR logged_warning |
279 | | -// PURITY: SHELL |
280 | | -// EFFECT: shell commands executed by generated entrypoint |
281 | | -// INVARIANT: browser data volume is preserved; runtime cleanup removes only the browser container |
282 | | -// COMPLEXITY: O(build + docker-run)/O(1) |
283 | | -export const renderPlaywrightBrowserRuntime = (): string => |
284 | | - String.raw`#!/usr/bin/env bash |
285 | | -set -euo pipefail |
286 | | -
|
287 | | -docker_git_browser_log() { |
288 | | - printf '%s\n' "[docker-git-browser] $*" >&2 |
289 | | -} |
290 | | -
|
291 | | -docker_git_browser_has_docker() { |
292 | | - command -v docker >/dev/null 2>&1 && docker info >/dev/null 2>&1 |
293 | | -} |
294 | | -
|
295 | | -docker_git_browser_context_dir() { |
296 | | - printf '%s\n' "\${DOCKER_GIT_BROWSER_CONTEXT_DIR:-/opt/docker-git/browser}" |
297 | | -} |
298 | | -
|
299 | | -docker_git_stop_playwright_browser() { |
300 | | - local container_name="\${DOCKER_GIT_BROWSER_CONTAINER_NAME:-}" |
301 | | - if [[ -z "$container_name" ]]; then |
302 | | - return 0 |
303 | | - fi |
304 | | - if ! docker_git_browser_has_docker; then |
305 | | - return 0 |
306 | | - fi |
307 | | - docker rm -f "$container_name" >/dev/null 2>&1 || true |
308 | | -} |
309 | | -
|
310 | | -docker_git_start_playwright_browser() { |
311 | | - if [[ "\${MCP_PLAYWRIGHT_ENABLE:-0}" != "1" ]]; then |
312 | | - docker_git_stop_playwright_browser || true |
313 | | - return 0 |
314 | | - fi |
315 | | -
|
316 | | - local container_name="\${DOCKER_GIT_BROWSER_CONTAINER_NAME:-}" |
317 | | - local image_name="\${DOCKER_GIT_BROWSER_IMAGE_NAME:-}" |
318 | | - local volume_name="\${DOCKER_GIT_BROWSER_VOLUME_NAME:-}" |
319 | | - local main_container="\${DOCKER_GIT_PROJECT_CONTAINER_NAME:-}" |
320 | | - local context_dir |
321 | | - context_dir="$(docker_git_browser_context_dir)" |
322 | | -
|
323 | | - if [[ -z "$container_name" || -z "$image_name" || -z "$volume_name" || -z "$main_container" ]]; then |
324 | | - docker_git_browser_log "missing browser runtime configuration; skipping nested browser start" |
325 | | - return 0 |
326 | | - fi |
327 | | - if ! docker_git_browser_has_docker; then |
328 | | - docker_git_browser_log "Docker API is unavailable; skipping nested browser start" |
329 | | - return 0 |
330 | | - fi |
331 | | - if [[ ! -f "$context_dir/Dockerfile.browser" ]]; then |
332 | | - docker_git_browser_log "browser Dockerfile is missing at $context_dir/Dockerfile.browser" |
333 | | - return 0 |
334 | | - fi |
335 | | -
|
336 | | - docker_git_browser_log "building $image_name" |
337 | | - docker build -t "$image_name" -f "$context_dir/Dockerfile.browser" "$context_dir" >/var/log/docker-git-browser-build.log 2>&1 || { |
338 | | - docker_git_browser_log "browser image build failed; see /var/log/docker-git-browser-build.log" |
339 | | - return 0 |
340 | | - } |
341 | | -
|
342 | | - docker_git_stop_playwright_browser || true |
343 | | - docker volume create "$volume_name" >/dev/null |
344 | | -
|
345 | | - local args=( |
346 | | - run |
347 | | - -d |
348 | | - --name "$container_name" |
349 | | - --label "docker-git.browser=1" |
350 | | - --label "docker-git.project-container=$main_container" |
351 | | - --network "container:$main_container" |
352 | | - --shm-size "2g" |
353 | | - -e "VNC_NOPW=1" |
354 | | - -e "MCP_PLAYWRIGHT_CDP_GUARD=\${MCP_PLAYWRIGHT_CDP_GUARD:-1}" |
355 | | - -e "MCP_PLAYWRIGHT_BLOCK_BROWSER_CLOSE=\${MCP_PLAYWRIGHT_BLOCK_BROWSER_CLOSE:-1}" |
356 | | - -v "$volume_name:/data" |
357 | | - ) |
358 | | -
|
359 | | - if [[ -n "\${DOCKER_GIT_BROWSER_CPU_LIMIT:-}" ]]; then |
360 | | - args+=(--cpus "$DOCKER_GIT_BROWSER_CPU_LIMIT") |
361 | | - fi |
362 | | - if [[ -n "\${DOCKER_GIT_BROWSER_RAM_LIMIT:-}" ]]; then |
363 | | - args+=(--memory "$DOCKER_GIT_BROWSER_RAM_LIMIT" --memory-swap "$DOCKER_GIT_BROWSER_RAM_LIMIT") |
364 | | - fi |
365 | | -
|
366 | | - docker_git_browser_log "starting $container_name inside $main_container network namespace" |
367 | | - docker "\${args[@]}" "$image_name" >/dev/null || { |
368 | | - docker_git_browser_log "failed to start $container_name" |
369 | | - return 0 |
370 | | - } |
371 | | -} |
372 | | -` |
0 commit comments