| # Copyright 2022 The Go Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style |
| # license that can be found in the LICENSE file. |
| # |
| # This file is JSON with comments. |
| # A comment is any line whose first non-whitespace character is #. |
| # A sed script in the Makefile and in deploy/worker.yaml removes |
| # the comments to produce valid JSON. |
| # |
| # This is a bundle config file for runsc, as specified by the |
| # Open Container Initiative: see |
| # https://github.com/opencontainers/runtime-spec/blob/main/config.md. |
| # Most of this file is generated by "runsc spec"; see |
| # https://gvisor.dev/docs/user_guide/quick_start/oci. |
| # The few important tweaks are commented. |
| { |
| "ociVersion": "1.0.0", |
| "process": { |
| "user": { |
| "uid": 0, |
| "gid": 0 |
| }, |
| "args": [ |
| # This is the command that "runsc run" will execute in the sandbox. |
| # See the internal/sandbox package. |
| # runsc will pipe the stdout and stderr to its caller, |
| # and will exit with the same return code. |
| "/runner" |
| ], |
| "env": [ |
| "PATH=/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", |
| "TERM=xterm" |
| ], |
| "cwd": "/", |
| "capabilities": { |
| "bounding": [ |
| "CAP_AUDIT_WRITE", |
| "CAP_KILL", |
| "CAP_NET_BIND_SERVICE" |
| ], |
| "effective": [ |
| "CAP_AUDIT_WRITE", |
| "CAP_KILL", |
| "CAP_NET_BIND_SERVICE" |
| ], |
| "inheritable": [ |
| "CAP_AUDIT_WRITE", |
| "CAP_KILL", |
| "CAP_NET_BIND_SERVICE" |
| ], |
| "permitted": [ |
| "CAP_AUDIT_WRITE", |
| "CAP_KILL", |
| "CAP_NET_BIND_SERVICE" |
| ] |
| }, |
| "rlimits": [ |
| { |
| "type": "RLIMIT_NOFILE", |
| "hard": 1048576, |
| "soft": 1048576 |
| } |
| ] |
| }, |
| "root": { |
| "path": "rootfs", |
| # The filesystem must be writeable so |
| # the go command can write to its caches. |
| "readonly": false |
| }, |
| "hostname": "runsc", |
| "mounts": [ |
| { |
| "destination": "/proc", |
| "type": "proc", |
| "source": "proc" |
| }, |
| { |
| "destination": "/dev", |
| "type": "tmpfs", |
| "source": "tmpfs" |
| }, |
| { |
| "destination": "/sys", |
| "type": "sysfs", |
| "source": "sysfs", |
| "options": [ |
| "nosuid", |
| "noexec", |
| "nodev", |
| "ro" |
| ] |
| }, |
| # Bind mounts. These let us map directories inside the sandbox |
| # (the destination) to directories outside (the source). |
| # If the source doesn't exist, you'll get the (obscure) error |
| # "cannot read client sync file". |
| # If the destination already exists, that's not an error, but the |
| # files in that directory will be hidden to code running inside the |
| # sandbox. |
| { |
| # Mount /app/binaries inside the sandbox to |
| # the same directory outside. |
| "destination": "/app/binaries", |
| "type": "none", |
| "source": "/app/binaries", |
| "options": ["bind"] |
| }, |
| { |
| # Mount /app/go-vulndb inside the sandbox to |
| # the same directory outside. |
| "destination": "/app/go-vulndb", |
| "type": "none", |
| "source": "/app/go-vulndb", |
| "options": ["bind"] |
| }, |
| { |
| # Mount /tmp/modules inside the sandbox to |
| # the same directory outside. |
| "destination": "/tmp/modules", |
| "type": "none", |
| "source": "/tmp/modules", |
| "options": ["bind"] |
| } |
| ], |
| "linux": { |
| "namespaces": [ |
| { |
| "type": "pid" |
| }, |
| { |
| "type": "network" |
| }, |
| { |
| "type": "ipc" |
| }, |
| { |
| "type": "uts" |
| }, |
| { |
| "type": "mount" |
| } |
| ] |
| } |
| } |