blob: 1c84398c7d952428b7f93cf38ba53f59c69d30ed [file] [log] [blame]
# Copyright 2023 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 Dockerfile expects the build context to be the repo root.
# To test that the worker built with this Dockerfile runs, run
# make test
# from the repo root.
# NOTE: don't put anything in /tmp here. It will work locally,
# but Cloud Run mounts something else to /tmp, so anything
# installed here will be shadowed.
FROM golang:1.21.2
LABEL maintainer="Go Ecosystem Team <go-ecosystem-team@google.com>"
#### Preliminaries
WORKDIR /
# Create some directories.
# The worker binary and related files live here.
RUN mkdir /app
# When debugging the sandbox manually, run this as well:
# RUN mkdir /tmp/modules
# Where binaries live.
# Mapped by the sandbox config to the same place inside the sandbox.
# If you change this, you must also edit the bind mount in config.json.commented.
#
# We use an ARG command here to make a variable, but this is not intended to be
# provided as a command-line argument to `docker build`.
ARG BINARY_DIR=/app/binaries
RUN mkdir $BINARY_DIR
#### Sandbox setup
# Install runsc.
ADD https://storage.googleapis.com/gvisor/releases/release/20240115.0/x86_64/runsc /usr/local/bin/
RUN chmod a+rx /usr/local/bin/runsc
# Set up for runsc.
# runsc expects a directory called a "bundle" that contains a config.json
# file and an OS filesystem.
# Create the runsc bundle.
WORKDIR /bundle
# The root of the bundle filesystem.
RUN mkdir rootfs
# go-image.tar.gz is a complete Docker image of a Go installation in tar format.
# Use it for the bundle's OS filesystem.
COPY go-image.tar.gz .
RUN tar --same-owner -pxzf go-image.tar.gz -C rootfs
# Copy the downloaded copy of the vuln DB
# into the /app dir similar to binaries.
ARG VULNDB_DIR=/app/go-vulndb
COPY go-vulndb $VULNDB_DIR
COPY config.json .
#### Building binaries
# Set the working directory outside $GOPATH to ensure module mode is enabled.
WORKDIR /src
# Copy go.mods and go.sums into the container.
# If they don't change, which is the common case, then docker can
# cache these COPYs and the subsequent RUN.
COPY go.mod go.sum checks.bash ./
# Copy the repo from local machine into Docker client’s current working
# directory, so that we can use it to build the binary.
# See .dockerignore at the repo root for excluded files.
COPY . /src
# Download the dependencies.
RUN go mod download
# Build the worker binary and put it in /app.
RUN go build -mod=readonly -o /app/worker ./cmd/worker
# TODO: install the latest version of govulncheck?
# Build the version of govulncheck specified in the go.mod file.
RUN go build -o $BINARY_DIR golang.org/x/vuln/cmd/govulncheck
# Build the program that runs govulncheck inside the sandbox.
RUN go build -mod=readonly -o $BINARY_DIR/govulncheck_sandbox ./cmd/govulncheck_sandbox
# Build the program that runs govulncheck comparisons inside the sandbox
RUN go build -mod=readonly -o $BINARY_DIR/govulncheck_compare ./cmd/govulncheck_compare
# Build the sandbox runner program and put it in the bundle root.
RUN go build -mod=readonly -o /bundle/rootfs/runner ./internal/sandbox/runner.go
#### Worker setup
WORKDIR /app
ARG DOCKER_IMAGE
ENV DOCKER_IMAGE=$DOCKER_IMAGE
ARG BQ_DATASET
ENV GO_ECOSYSTEM_BIGQUERY_DATASET=$BQ_DATASET
ARG SERVICE_ID
ENV GO_ECOSYSTEM_SERVICE_ID=$SERVICE_ID
ENV GO_ECOSYSTEM_BINARY_DIR=$BINARY_DIR
ENV GO_ECOSYSTEM_VULNDB_DIR=$VULNDB_DIR
CMD ["./worker"]