Skip to content
This repository was archived by the owner on Oct 22, 2023. It is now read-only.

Latest commit

 

History

History
654 lines (465 loc) · 14.1 KB

File metadata and controls

654 lines (465 loc) · 14.1 KB
title Cheat sheet

import AsciinemaPlayer from "../../src/components/AsciinemaPlayer";

Skeleton configuration file

containers:
  my-container:
    image: alpine:3.11.3

tasks:
  say-hello:
    description: Say hello to the nice person reading the Batect documentation
    run:
      container: my-container
      command: echo 'Hello world!'

Container basics

Define a container

containers:
  my-container:
    image: alpine:3.11.3
    command: echo "Hello world"

Reference: containers

Set the default command to run in a container

containers:
  my-container:
    # ...other config
    command: echo "Hello world"

Reference: command

Set the default working directory for a container

containers:
  my-container:
    # ...other config
    working_directory: /my/working/dir

Reference: working_directory

Set an environment variable for a container

containers:
  my-container:
    # ...other config
    environment:
      MY_ENVIRONMENT_VARIABLE: "the value"

Reference: environment

Mount a file or directory into a container

Mount the project directory into the container at /code:

containers:
  my-container:
    # ...other config
    volumes:
      - local: .
        container: /code

Reference: volumes

Docker images

Use an existing Docker image for a container

containers:
  my-container:
    image: alpine:3.11.3

Reference: image

Build a local Dockerfile to use as the image for a container

Use the Dockerfile from the images/my-container directory:

containers:
  my-container:
    build_directory: images/my-container

Reference: build_directory

Pass a build arg to a Dockerfile

containers:
  my-container:
    build_directory: images/my-container
    build_args:
      MY_BUILD_ARG: "some value"

Reference: build_args

Use a custom Dockerfile file name

Use the file AnotherDockerfile from the images/my-container directory:

containers:
  my-container:
    build_directory: images/my-container
    dockerfile: AnotherDockerfile

Reference: dockerfile

Task basics

Define a task

tasks:
  my-task:
    run:
      container: my-container

Reference: tasks

Override the command for the task container

tasks:
  my-task:
    run:
      container: my-container
      command: echo 'Hello there!'

Reference: command

Override the working directory for the task container

tasks:
  my-task:
    run:
      container: my-container
      working_directory: /some/other/directory

Reference: working_directory

Set an environment variable for the task container

tasks:
  my-task:
    run:
      container: my-container
      environment:
        MY_ENVIRONMENT_VARIABLE: "the value"

Reference: environment

Expose additional ports on the task container

tasks:
  my-task:
    run:
      container: my-container
      ports:
        - local: 8080
          container: 8080

Reference: ports

Task lifecycle

Dependencies

Require one container to start before another (create a dependency)

This can be configured in two ways: on the container, or on a per-task basis.

To specify that a container must always start before another container:

containers:
  my-container:
    # ...other config
    dependencies:
      - other-container

To specify that a container must start before the main task container for a single task:

tasks:
  my-task:
    run:
      container: my-container
    dependencies:
      - other-container

Reference: container: dependencies, task: dependencies

Wait for a container to be ready to accept requests before starting containers that depend on it

Batect will automatically use a health check defined in the container's image's Dockerfile:

FROM my-image:1.2.3

HEALTHCHECK --interval=2s --retries=10 CMD /tools/health-check.sh

Alternatively, specify the health check settings on the container:

containers:
  my-container:
    # ...other config
    health_check:
      command: /tools/health-check.sh
      retries: 10
      interval: 2s

The command must exit with a non-zero exit code when the container is not ready, and exit with a zero exit code when the container is ready.

Reference: HEALTHCHECK, health_check

Run a command in a container before starting containers that depend on it

containers:
  my-container:
    # ...other config
    setup_commands:
      - command: /tools/setup.sh

Reference: setup_commands

Customise the environment variables of a dependency container

tasks:
  my-task:
    dependencies:
      - other-container
    run:
      container: my-container
    customise:
      other-container:
        environment:
          OVERRIDDEN_VAR: overridden value from task
          NEW_VAR: new value from task

containers:
  main-container:
    image: ...

  other-container:
    image: ...
    environment:
      CONTAINER_VAR: set on container
      OVERRIDDEN_VAR: won't be used

When the task my-task is run, other-container will start with the environment variables:

  • CONTAINER_VAR: set on container
  • OVERRIDDEN_VAR: overridden value from task
  • NEW_VAR: new value from task

Reference: customise

Expose additional ports on a dependency container

tasks:
  my-task:
    dependencies:
      - other-container
    run:
      container: my-container
    customise:
      other-container:
        ports:
          - 3000:4000

containers:
  main-container:
    image: ...

  other-container:
    image: ...
    ports:
      - 1000:2000

When the task my-task is run, other-container will start with container ports 2000 and 4000 exposed as ports 1000 and 3000 on the host machine.

Reference: customise

Customise the working directory of a dependency container

tasks:
  my-task:
    dependencies:
      - other-container
    run:
      container: my-container
    customise:
      other-container:
        working_directory: /customised

containers:
  main-container:
    image: ...

  other-container:
    image: ...
    working_directory: /wont-be-used

When the task my-task is run, other-container will in /customised.

Reference: customise

Require one task to run to completion before another (create a prerequisite)

tasks:
  my-task:
    prerequisites:
      - my-other-task
    run:
      container: my-container

  my-other-task:
    # ...config for task

Reference: prerequisites

Caching

Cache a directory between task invocations

containers:
  my-container:
    # ...other config
    volumes:
      - type: cache
        name: my_cache
        container: /caches/my_cache

Reference: volumes and caches

Clean all caches for the current project

./batect --clean

Reference: --clean

CI

Use directories for caches instead of volumes

Use the --cache-type=directory option, or set the BATECT_CACHE_TYPE environment variable to directory:

./batect --cache-type=directory my-task

Reference: --cache-type

Avoiding port conflicts

./batect --disable-ports my-task

Reference: --disable-ports

Config variables

Defining a config variable

config_variables:
  log_level:
    description: Log level to use for application
    default: debug

Reference: config_variables

Referencing a config variable

Use an expression like <{log_level} on supported properties.

Overriding a config variable on the command line

./batect --config-var log_level=warning my-task

Reference: --config-var

Overriding a config variable with a file

Create a YAML file in variable_name: value format, for example:

log_level: warning
host: myawesomeapp.com

Then use --config-vars-file to tell Batect to use that file:

./batect --config-vars-file=my-vars.yml my-task

Batect will automatically use config variables from a file called batect.local.yml if it exists and --config-vars-file is not specified.

Reference: --config-vars-file

Configurability

Use an environment variable from the host machine

Use an expression like $MY_ENVIRONMENT_VARIABLE on supported properties.

Defining and using a config variable

config_variables:
  log_level:
    description: Log level to use for application
    default: debug

Then use an expression like <{log_level} on supported properties.

Reference: config_variables

Debugging

See output from all containers when running a task

Use --output=all:

./batect --output=all my-task

This produces output similar to the following:

<AsciinemaPlayer src={require("../assets/outputstyles/interleaved.cast").default} width={204} height={20} preload={true} poster="npt:4" />

Reference: --output

Disable cleanup of containers when a task finishes

Use --no-cleanup, --no-cleanup-after-failure or --no-cleanup-after-success:

./batect --no-cleanup my-task

Reference: --no-cleanup, --no-cleanup-after-failure and --no-cleanup-after-success

Docker

Access the host machine's Docker daemon from within a container

Mount the Docker daemon socket into the container, and then use the docker CLI tool like normal:

containers:
  docker-env:
    volumes:
      - local: /var/run/docker.sock
        container: /var/run/docker.sock

Note that local settings like registry credentials will not be forwarded to the container - the container will need to be configured with these.

Connect to a Docker daemon using non-default connection settings

Use --docker-host (or set the DOCKER_HOST environment variable):

./batect --docker-host=unix:///var/run/other-docker.sock

This option accepts Unix sockets (on macOS and Linux), named pipes (on Windows) and TCP addresses (on all platforms).

Reference: --docker-host

Includes and bundles

Split a configuration file into multiple files

If /my-project/a.yml contains:

containers:
  my-container:
    image: my-image:1.2.3

include:
  - includes/b.yml

And /my-project/includes/b.yml contains:

tasks:
  my-task:
    run:
      container: my-container

Then the resulting configuration is as if /my-project/a.yml was:

containers:
  my-container:
    image: my-image:1.2.3

tasks:
  my-task:
    run:
      container: my-container

Reference: include

Reference a bundle

include:
  - type: git
    repo: https://github.com/batect/hello-world-bundle.git
    ref: 0.2.0

Reference: include

Networking

Expose a port to the host machine

This makes port 5678 on the container accessible at port 1234 on the host machine:

containers:
  my-container:
    # ...other config
    ports:
      - local: 1234
        container: 5678

Reference: ports

Expose a port to other containers in the task

There is no configuration required to expose a port from a container to another container running in the same task.

Use the name of the container as its hostname. For example, to make a HTTP request to port 8080 on my-container from another container, use http://my-container:8080.

Add another hostname to a container

This allows other containers to reference my-container by using other-name:

containers:
  my-container:
    # ...other config
    additional_hostnames:
      - other-name

Reference: additional_hostnames

Add extra hostnames to /etc/hosts

To configure processes inside my-container to resolve database.example.com to 1.2.3.4:

containers:
  my-container:
    # ...other config
    additional_hosts:
      database.example.com: 1.2.3.4

Reference: additional_hosts

Other

Avoiding build artefacts being owned by root

Use run as current user mode:

containers:
  my-container:
    # ...other config
    run_as_current_user:
      enabled: true
      home_directory: /home/container-user

Reference: run_as_current_user