Welcome to Knowledge Base!

KB at your finger tips

This is one stop global knowledge base where you can learn about all the products, solutions and support features.

Categories
All
DevOps-Docker
Get started

Get started

Note

Atomist is currently in Early Access. Features and APIs are subject to change.

To get started with Atomist, you’ll need to:

  • Connect Atomist with your container registry
  • Link your container images with their Git source

Before you can begin the setup, you need a Docker ID. If you don’t already have one, you can register here.

Connect container registry

This section describes how to integrate Atomist with your container registry. Follow the applicable instructions depending on the type of container registry you use. After completing this setup, Atomist will have read-only access to your registry, and gets notified about pushed or deleted images.

Using Docker Hub? 🐳

If you are using Docker Hub as your container registry, you can skip this step and go straight to linking images to Git source. Atomist integrates seamlessly with your Docker Hub organizations.


When setting up an Amazon Elastic Container Registry (ECR) integration with Atomist, the following AWS resources are required:

  • Read-only Identity Access Management (IAM) role, for Atomist to be able to access the container registry
  • Amazon EventBridge, to notify Atomist of pushed and deleted images

This procedure uses pre-defined CloudFormation templates to create the necessary IAM role and Amazon EventBridge. This template protects you from confused deputy attacks by ensuring a unique ExternalId , along with the appropriate condition on the IAM role statement.

  1. Go to https://dso.docker.com and sign in using your Docker ID credentials.
  2. Navigate to the Integrations tab and select Configure next to the Elastic Container Registry integration.
  3. Fill out all the fields, except Trusted Role ARN . The trusted role identity is known only after applying the CloudFormation template.

    Choose basic auth credentials to protect the endpoint that AWS uses to notify Atomist. The URL and the basic auth credentials are parameters to the CloudFormation template.

  4. Now create the CloudFormation stack. Before creating the stack, AWS asks you to enter three parameters.

    • Url : the API endpoint copied from Atomist
    • Username , Password : basic authentication credentials for the endpoint. Must match what you entered in the Atomist workspace.

    Use the following Launch Stack buttons to start reviewing the details in your AWS account.

    Note

    Before creating the stack, AWS will ask for acknowledgement that creating this stack requires a capability. This stack creates a role that will grant Atomist read-only access to ECR resources.

    confirm

    Region ecr-integration.template
    us-east-1 Launch Stack
    us-east-2 Launch Stack
    us-west-1 Launch Stack
    us-west-2 Launch Stack
    eu-west-1 Launch Stack
    eu-west-2 Launch Stack
    eu-west-3 Launch Stack
    eu-central-1 Launch Stack
    ca-central-1 Launch Stack
    ap-southeast-2 Launch Stack
  5. After creating the stack, copy the Value for the AssumeRoleArn key from the Outputs tab in AWS.

    AWS stack creation output

  6. Paste the copied AssumeRoleArn value into the Trusted Role ARN field on the Atomist configuration page.

  7. Select Save Configuration .

    Atomist tests the connection with your ECR registry. A green check mark displays beside the integration if a successful connection is made.

    integration list showing a successful ECR integration

To integrate Atomist with GitHub Container Registry, connect your GitHub account, and enter a personal access token for Atomist to use when pulling container images.

  1. Go to https://dso.docker.com and sign in using your Docker ID credentials.
  2. Connect your GitHub account as instructed in the GitHub app page.
  3. Open the Integrations tab, and select Configure next to the GitHub Container Registry in the list.
  4. Fill out the fields and select Save Configuration .

    Atomist requires the Personal access token for connecting images to private repositories. The token must have the read:packages scope.

    Leave the Personal access token field blank if you only want to index images in public repositories.

Setting up an Atomist integration with Google Container Registry and Google Artifact Registry involves:

  • Creating a service account and grant it a read-only access role.
  • Creating a PubSub subscription on the gcr topic to watch for activity in the registry.

To complete the following procedure requires administrator’s permissions in the project.

  1. Set the following environment variables. You will use them in the next steps when configuring the Google Cloud resources, using the gcloud CLI.

    export SERVICE_ACCOUNT_ID="atomist-integration" # can be anything you like
    export PROJECT_ID="YOUR_GCP_PROJECT_ID"
    
  2. Create the service account.

    gcloud iam service-accounts create ${SERVICE_ACCOUNT_ID} \
        --project ${PROJECT_ID} \
        --description="Atomist Integration Service Account" \
        --display-name="Atomist Integration"
    
  3. Grant the service account read-only access to the artifact registry.

    The role name differs depending on whether you use Artifact Registry or Container Registry:

    • roles/artifactregistry.reader for Google Artifact Registry
    • roles/object.storageViewer for Google Container Registry
    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --project ${PROJECT_ID} \
        --member="serviceAccount:${SERVICE_ACCOUNT_ID}@${PROJECT_ID}.iam.gserviceaccount.com" \
        --role="roles/artifactregistry.reader" # change this if you use GCR
    
  4. Grant service account access to Atomist.

    gcloud iam service-accounts add-iam-policy-binding "${SERVICE_ACCOUNT_ID}@${PROJECT_ID}.iam.gserviceaccount.com" \
        --project ${PROJECT_ID} \
        --member="serviceAccount:atomist-bot@atomist.iam.gserviceaccount.com" \
        --role="roles/iam.serviceAccountTokenCreator"
    
  5. Go to dso.docker.com and sign in with your Docker ID credentials.
  6. Navigate to the Integrations tab and select Configure next to the Google Artifact Registry integration.
  7. Fill out the following fields:

    • Project ID is the PROJECT_ID used in earlier steps.
    • Service Account : The email address of the service account created step 2.
  8. Select Save Configuration . Atomist will test the connection. Green check marks indicate a successful connection.

    GCP configuration successful

    Next, create a new PubSub subscription on the gcr topic in registry. This subscription notifies Atomist about new or deleted images in the registry.

  9. Copy the URL in the Events Webhook field to your clipboard. This will be the PUSH_ENDPOINT_URI for the PubSub subscription.

  10. Define the following three variable values, in addition to the PROJECT_ID and SERVICE_ACCOUNT_ID from earlier:

    • PUSH_ENDPOINT_URL : the webhook URL copied from the Atomist workspace.
    • SERVICE_ACCOUNT_EMAIL : the service account address; a combination of the service account ID and project ID.
    • SUBSCRIPTION : the name of the PubSub (can be anything).
    PUSH_ENDPOINT_URI={COPY_THIS_FROM_ATOMIST}
    SERVICE_ACCOUNT_EMAIL="${SERVICE_ACCOUNT_ID}@${PROJECT_ID}.iam.gserviceaccount.com"
    SUBSCRIPTION="atomist-integration-subscription"
    
  11. Create the PubSub for the gcr topic.

    gcloud pubsub subscriptions create ${SUBSCRIPTION} \
      --topic='gcr' \
      --push-auth-token-audience='atomist' \
      --push-auth-service-account="${SERVICE_ACCOUNT_EMAIL}" \
      --push-endpoint="${PUSH_ENDPOINT_URI}"
    

When the first image push is successfully detected, a green check mark on the integration page will indicate that the integration works.

Atomist can index images in a JFrog Artifactory repository by means of a monitoring agent.

The agent scans configured repositories at regular intervals, and send newly discovered images’ metadata to the Atomist data plane.

In the following example, https://hal9000.atomist.com is a private registry only visible on an internal network.

docker run -ti atomist/docker-registry-broker:latest\
  index-image remote \
  --workspace AQ1K5FIKA \
  --api-key team::6016307E4DF885EAE0579AACC71D3507BB38E1855903850CF5D0D91C5C8C6DC0 \
  --artifactory-url https://hal9000.docker.com \
  --artifactory-repository atomist-docker-local \
  --container-registry-host atomist-docker-local.hal9000.docker.com
  --username admin \
  --password password
Parameter Description
workspace ID of your Atomist workspace.
api-key Atomist API key.
artifactory-url Base URL of the Artifactory instance. Must not contain trailing slashes.
artifactory-repository The name of the container registry to watch.
container-registry-host The hostname associated with the Artifactory repository containing images, if different from artifactory-url .
username Username for HTTP basic authentication with Artifactory.
password Password for HTTP basic authentication with Artifactory.

Knowing the source repository of an image is a prerequisite for Atomist to interact with the Git repository. For Atomist to be able to link scanned images back to a Git repository repository, you must annotate the image at build time.

The image labels that Atomist requires are:

Label Value
org.opencontainers.image.revision The commit revision that the image is built for.
com.docker.image.source.entrypoint Path to the Dockerfile, relative to project root.

For more information about pre-defined OCI annotations, see the specification document on GitHub.

You can add these labels to images using the built-in Git provenance feature of Buildx, or set using the --label CLI argument.

Add labels using Docker Buildx

Beta

Git provenance labels in Buildx is a Beta feature.

To add the image labels using Docker Buildx, set the environment variable BUILDX_GIT_LABELS=1 . The Buildx will create the labels automatically when building the image.

export BUILDX_GIT_LABELS=1
docker buildx build . -f docker/Dockerfile

Add labels using the label CLI argument

Assign image labels using the --label argument for docker build .

docker build . -f docker/Dockerfile -t $IMAGE_NAME \
    --label "org.opencontainers.image.revision=10ac8f8bdaa343677f2f394f9615e521188d736a" \
    --label "com.docker.image.source.entrypoint=docker/Dockerfile"

Images built in a CI/CD environment can leverage the built-in environment variables when setting the Git revision label:

Build tool Environment variable
GitHub Actions ${{ github.sha }}
GitHub Actions, pull requests ${{ github.event.pull_request.head.sha }}
GitLab CI/CD $CI_COMMIT_SHA
Docker Hub automated builds $SOURCE_COMMIT
Google Cloud Build $COMMIT_SHA
AWS CodeBuild $CODEBUILD_RESOLVED_SOURCE_VERSION
Manually $(git rev-parse HEAD)

Consult the documentation for your CI/CD platform to learn which variables to use.

Where to go next

Atomist is now tracking bill of materials, packages, and vulnerabilities for your images! You can view your image scan results on the images overview page.

Teams use Atomist to protect downstream workloads from new vulnerabilities. It’s also used to help teams track and remediate new vulnerabilities that impact existing workloads. The following sections describe integrate and configure Atomist further. For example, to gain visibility into container workload systems like Kubernetes.

  • Connect Atomist with your GitHub repositories by installing the Atomist app for your GitHub organization.
  • Manage which Atomist features you use in settings.
  • Learn about deployment tracking and how Atomist can help watch your deployed containers.
  • Atomist watches for new advisories from public sources, but you can also add your own internal advisories for more information.
Introduction to Atomist

Introduction to Atomist

Note

Atomist is currently in Early Access. Features and APIs are subject to change.

Atomist is a data and automation platform for managing the software supply chain. It extracts metadata from container images, evaluates the data, and helps you understand the state of the image.

Integrating Atomist into your systems and repositories grants you essential information about the images you build, and the containers running in production. Beyond collecting and visualizing information, Atomist can help you further by giving you recommendations, notifications, validation, and more.

Example capabilities made possible with Atomist are:

  • Stay up to date with advisory databases without having to re-analyze your images.
  • Automatically open pull requests to update base images for improved product security.
  • Check that your applications don’t contain secrets, such as a password or API token, before they get deployed.
  • Dissect Dockerfiles and see where vulnerabilities come from, line by line.

How it works

Atomist monitors your container registry for new images. When it finds a new image, it analyzes and extracts metadata about the image contents and any base images used. The metadata is uploaded to an isolated partition in the Atomist data plane where it’s securely stored.

The Atomist data plane is a combination of metadata and a large knowledge graph of public software and vulnerability data. Atomist determines the state of your container by overlaying the image metadata with the knowledge graph.

What’s next?

Head over to the try atomist page for instructions on how to run Atomist, locally and with no strings attached.

Read article
Track deployments

Track deployments

Note

Atomist is currently in Early Access. Features and APIs are subject to change.

By integrating Atomist with a runtime environment, you can track vulnerabilities for deployed containers. This gives you contexts for whether security debt is increasing or decreasing.

There are several options for how you could implement deployment tracking:

  • Invoking the API directly
  • Adding it as a step in your continuous deployment pipeline
  • Creating Kubernetes admission controllers

API

Each Atomist workspace exposes an API endpoint. Submitting a POST request to the endpoint updates Atomist about what image you are running in your environments. This lets you compare data for images you build against images of containers running in staging or production.

You can find the API endpoint URL on the Integrations page. Using this API requires an API key.

The most straight-forward use is to post to this endpoint using a webhook. When deploying a new image, submit an automated POST request (using curl , for example) as part of your deployment pipeline.

$ curl <api-endpoint-url> \\
  -X POST \\
  -H "Content-Type: application/json" \\
  -H "Authorization: Bearer <api-token>" \\
  -d '{"image": {"url": "<image-url>@<sha256-digest>"}}'

Parameters

The API supports the following parameters in the request body:

{
  "image": {
    "url": "string",
    "name": "string"
  },
  "environment": {
    "name": "string"
  },
  "platform": {
    "os": "string",
    "architecture": "string",
    "variant": "string"
  }
}
Parameter Mandatory Default Description
image.url Yes  Fully qualified reference name of the image, plus version (digest). You must specify the image version by digest.
image.name No  Optional identifier. If you deploy many containers from the same image in any one environment, each instance must have a unique name.
environment.name No deployed Use custom environment names to track different image versions in environments, like staging and production
platform.os No linux Image operating system.
platform.architecture No amd64 Instruction set architecture.
platform.variant No  Optional variant label.
Read article
Integrate with GitHub

Integrate with GitHub

Note

Atomist is currently in Early Access. Features and APIs are subject to change.

When installed for a GitHub organization, the Atomist GitHub app links repository activity to images. This enables Atomist to relate image tags and digests directly to specific commits in the source repository. It also opens up the possibility to incorporate image analysis in your Git workflow. For example, by adding analysis checks to pull request, or automatically raising pull requests for updating and pinning base image versions.

Install the GitHub app in the organization that contains the source code repositories for your Docker images.

Connect to GitHub

  1. Go to https://dso.docker.com/ and sign in using your Docker ID.
  2. Open the Repositories tab.
  3. Select Connect to GitHub and follow the authorization flow. This installs the Atomist GitHub App.

    install the GitHub app

  4. Install the app.

    Note

    If your GitHub account is a member of one or more organizations, GitHub prompts you to choose which account to install the app into. Select the account that contains the source repositories for your images.

    After installing the app, GitHub redirects you back to Atomist.

  5. In the repository selection menu, select what repositories you want Atomist to start watching.

    activate repositories

    If you are just looking to evaluate Atomist, start by selecting a few repositories during evaluation. Once you are comfortable using Atomist, you can switch on the integration for all repositories. Selecting All repositories also includes any repository created in the future.

    Important

    If Atomist detects FROM commands in Dockerfiles in the selected repositories, it begins raising automated pull requests. The pull requests update the Dockerfile FROM -line to specify the image versions (as digests).

  6. Select Save selection .

Atomist is now connected with your GitHub repositories and is be able to link image analyses with Git commits.

Manage repository access

If you wish to add or remove repository access for Atomist, go to the Repositories page.

  • Select All repositories if you want enable Atomist for all connected organizations and repositories.
  • Select Only select repositories if you want to provision access to only a subset of repositories.

Disconnect from GitHub

You might want to disconnect from GitHub when:

  • You want to change which GitHub organization or account connected to your Atomist workspace.

    To do so, disconnect the old GitHub organization or account first. Then, follow the instructions for connecting to GitHub for the new GitHub organization or account.

  • You want to remove Atomist access to a GitHub organization or account when you no longer use Atomist.

To disconnect a GitHub account:

  1. Go to Repositories and select the Disconnect link. This removes the connection to your GitHub organization or account.
  2. Go to the GitHub Applications settings page, then:

  3. Find atomist on the Installed GitHub Apps tab.
  4. Select Configure

  5. Select Uninstall . This removes the installation of the Atomist GitHub App from your GitHub organization or account.

  6. Find atomist on the Authorized GitHub Apps tab.
  7. Select Revoke .

    This removes the authorization of the Atomist GitHub App from your GitHub organization or account.

Read article
Try Atomist

Try Atomist

Note

Atomist is currently in Early Access. Features and APIs are subject to change.

The quickest way to try Atomist is to run it on your local images, as a CLI tool. Trying it locally eliminates the need of having to integrate with and connect to a remote container registry. The CLI uses your local Docker daemon directly to upload the Software Bill of Materials (SBOM) to the Atomist control plane for analysis.

Prerequisites

Before you can begin the setup, you need a Docker ID. If you don’t already have one, you can register here.

Steps

Note

Only use this CLI-based method of indexing images for testing or trial purposes. For further evaluation or production use, integrate Atomist with your container registry. See get started.

  1. Go to the Atomist website and sign in using your Docker ID.
  2. Open the Integrations tab.
  3. Under API Keys , create a new API key.
  4. In your terminal of choice, invoke the Atomist CLI tool using docker run . Update the following values:

    • --workspace : the workspace ID found on the Integrations page on the Atomist website.
    • --api-key : the API key you just created.
    • --image : the Docker image that you want to index.
    docker run \
       -v /var/run/docker.sock:/var/run/docker.sock \
       -ti atomist/docker-registry-broker:latest \
       index-image local \
       --workspace AQ1K5FIKA \
       --api-key team::6016307E4DF885EAE0579AACC71D3507BB38E1855903850CF5D0D91C5C8C6DC0 \
       --image docker.io/david/myimage:latest
    

    Note

    The image must have a tag (for example, myimage:latest ) so that you are able to identify the image later.

    The output should be similar to the following:

    [info] Starting session with correlation-id c12e08d3-3bcc-4475-ab21-7114da599eaf
    [info] Starting atomist/docker-vulnerability-scanner-skill 'index_image' (1f99caa) atomist/skill:0.12.0-main.44 (fe90e3c) nodejs:16.15.0
    [info] Indexing image python:latest
    [info] Downloading image
    [info] Download completed
    [info] Indexing completed
    [info] Mapped packages to layers
    [info] Indexing completed successfully
    [info] Transacting image manifest for docker.io/david/myimage:latest with digest sha256:a8077d2b2ff4feb1588d941f00dd26560fe3a919c16a96305ce05f7b90f388f6
    [info] Successfully transacted entities in team AQ1K5FIKA
    [info] Image URL is https://dso.atomist.com/AQ1K5FIKA/overview/images/myimage/digests/sha256:a8077d2b2ff4feb1588d941f00dd26560fe3a919c16a96305ce05f7b90f388f6
    [info] Transacting SBOM...
    [info] Successfully transacted entities in team AQ1K5FIKA
    [info] Transacting SBOM...
    
  5. When the command exits, open the Atomist web UI, where you should see the image in the list.

    indexed image in the image overview list

  6. Select the image name. This gets you to the list of image tags.

    list of image tags

    Since this is your first time indexing this image, the list only has one tag for now. When you integrate Atomist with your container registry, images and tags show up in this list automatically.

  7. Select the tag name. This shows you the insights for this tag.

    vulnerability breakdown view

    In this view, you can see how many vulnerabilities this image has, their severity levels, whether there is a fix version available, and more.

Where to go next

The tutorial ends here. Take some time to explore the different data views that Atomist presents about your image. When you’re ready, head to the get started guide to learn how to start integrating Atomist in your software supply chain.

Read article
Defining additional build contexts and linking targets

Defining additional build contexts and linking targets

In addition to the main context key that defines the build context each target can also define additional named contexts with a map defined with key contexts . These values map to the --build-context flag in the build command.

Inside the Dockerfile these contexts can be used with the FROM instruction or --from flag.

The value can be a local source directory, container image (with docker-image:// prefix), Git URL, HTTP URL or a name of another target in the Bake file (with target: prefix).

Pinning alpine image

# syntax=docker/dockerfile:1
FROM alpine
RUN echo "Hello world"
# docker-bake.hcl
target "app" {
  contexts = {
    alpine = "docker-image://alpine:3.13"
  }
}

Using a secondary source directory

# syntax=docker/dockerfile:1
FROM scratch AS src

FROM golang
COPY --from=src . .
# docker-bake.hcl
target "app" {
  contexts = {
    src = "../path/to/source"
  }
}

Using a result of one target as a base image in another target

To use a result of one target as a build context of another, specity the target name with target: prefix.

# syntax=docker/dockerfile:1
FROM baseapp
RUN echo "Hello world"
# docker-bake.hcl
target "base" {
  dockerfile = "baseapp.Dockerfile"
}

target "app" {
  contexts = {
    baseapp = "target:base"
  }
}

Please note that in most cases you should just use a single multi-stage Dockerfile with multiple targets for similar behavior. This case is recommended when you have multiple Dockerfiles that can’t be easily merged into one.

Read article