/// <reference types="node" />
import { Handle } from "@adpt/core";
import { ContainerLabels, ContainerProps } from "../Container";
import { Environment } from "../env";
import { DockerImageInstance } from "./DockerImage";
/**
 * Options for interacting with Docker Engine that apply to all
 * operations.
 * @public
 */
export interface DockerGlobalOptions {
    dockerHost?: string;
}
/**
 * Options for performing Docker image builds.
 * @public
 */
export interface DockerBuildOptions extends DockerGlobalOptions {
    /**
     * Requests BuildKit as the internal Docker build engine.
     *
     * @remarks
     * This option requests the use of the BuildKit build engine when building
     * Docker images, if BuildKit is available. This is primarily useful for
     * BuildKit's performance improvements over the legacy Docker build engine.
     * However, because this option does not guarantee BuildKit will be used,
     * BuildKit-only features such as secret mounting should not be used.
     *
     * Internally, this option sets the `DOCKER_BUILDKIT` environment
     * variable when performing builds, which enables BuildKit on Docker
     * systems that support it.
     *
     * For more information, see
     * [Build images with BuildKit](https://docs.docker.com/develop/develop-images/build_enhancements/).
     *
     * @defaultValue `true`
     */
    requestBuildKit?: boolean;
    forceRm?: boolean;
    imageName?: string;
    imageTag?: string;
    prevUniqueNameTag?: string;
    stdin?: string;
    /**
     * If true and the newly built image ID does not match the image ID for
     * prevUniqueNameTag (or prevUniqueNameTag is not set), a new unique nameTag is
     * generated for this image (from imageName and imageTag).
     * If true and the newly built image ID does match the image ID for
     * prevUniqueNameTag, then prevUniqueNameTag is returned as nameTag.
     * If false, imageName and imageTag are used without modification.
     */
    uniqueTag?: boolean;
    /**
     * If set, will add a Docker LABEL with the DeployID.
     */
    deployID?: string;
    buildArgs?: Environment;
}
/**
 * A dynamically-created file that can be used during the build of a Docker
 * image.
 *
 * @remarks
 * These `File` objects are used to create a temporary "scratch" image in a
 * {@link https://docs.docker.com/develop/develop-images/multistage-build/ | multi-stage build}
 * that contains only the specified files. Then, in later stages of that build,
 * the files within the temporary image can be copied into the later stage
 * image.
 * @public
 */
export interface File {
    /**
     * The path in the temporary image where the file will be created.
     */
    path: string;
    /**
     * The contents of the file.
     */
    contents: Buffer | string;
}
/**
 * A stage to be added to a
 * {@link https://docs.docker.com/develop/develop-images/multistage-build/ | multi-stage Docker build}.
 *
 * @remarks
 * The stage will be added to the generated Dockerfile for the image as:
 * ```
 * FROM image as name
 * ```
 * @public
 */
export interface Stage {
    /** The image (name + tag or digest) to use for the stage. */
    image: string;
    /** Name for the stage */
    name: string;
}
/**
 * A string that contains both a Docker repo and a registry digest.
 *
 * @remarks
 * This is a string that represents a specific image on a specific registry
 * contained in a particular repo on that registry. It's of the form:
 * ```
 * [registry/]repo@digest
 * ```
 * `registry` - (optional) The hostname or hostname:port of a Docker registry
 * where the repo is located. If not provided, the official default Docker
 * registry is assumed.
 *
 * `repo` - The more precise name for what's commonly referred to as an image
 * name. It may include 0 or more slashes to denote namespaces.
 *
 * `digest` - The repo digest for the image in the form `algorithm:hex`.
 * This digest is specific to the associated registry and repo and has no
 * significance without those additional pieces of information. If this image is
 * pushed to a different registry, it will have a different digest value.
 * The digest is also known as a "distribution hash".
 *
 * Examples:
 * ```
 * alpine@sha256:04696b491e0cc3c58a75bace8941c14c924b9f313b03ce5029ebbc040ed9dcd9
 * localhost:5000/mockdeploy-htws@sha256:899a03e9816e5283edba63d71ea528cd83576b28a7586cf617ce78af5526f209
 * ```
 * @public
 */
export declare type RepoDigestString = string;
/**
 * Docker image ID, in the form `algorithm:hex`.
 *
 * @remarks
 * The Docker image ID (also known as "Content Hash") is a single value
 * that uniquely identifies a specific image on a local Docker host.
 *
 * An image ID does not require a registry or repo qualifier to be significant.
 * It is distinct from a Docker image
 * {@link docker.RepoDigestString | repo digest}.
 *
 * Example:
 * ```
 * sha256:199e537da3a86126cd6eb114bd0b13ab178dc291bbb6ea4a4a3aa257b2366b71
 * ```
 * @public
 */
export declare type ImageIdString = string;
/**
 * A string reference to a Docker image that contains a repo name, and may
 * contain an optional registry and optional tag.
 *
 * @remarks
 * This is a string that references a Docker image. It's in the form of
 * one of:
 * ```
 * [registry/]repo
 * [registry/]repo:tag
 * ```
 * `registry` - (optional) The hostname or hostname:port of a Docker registry
 * where the repo is located. If not provided, depending on context, either
 * the official default Docker registry may be assumed or the image may just
 * be present locally and not on any registry.
 *
 * `repo` - The more precise name for what's commonly referred to as an image
 * name. It may include 0 or more slashes to denote namespaces.
 *
 * `tag` - A tag string identifying a version of image within the repo.
 *
 * Examples:
 * ```
 * alpine
 * ubuntu:16.04
 * ```
 * @public
 */
export declare type NameTagString = string;
/**
 * A string reference to a Docker image that contains a repo name, and may
 * contain an optional registry and optionally either a tag or a repo digest.
 *
 * @remarks
 * This is a string that references a Docker image. It's in the form of
 * one of:
 * ```
 * [registry/]repo
 * [registry/]repo:tag
 * [registry/]repo@digest
 * ```
 * For more detail, see {@link docker.NameTagString} and
 * {@link docker.RepoDigestString}.
 *
 * Examples:
 * ```
 * alpine
 * ubuntu:16.04
 * alpine@sha256:04696b491e0cc3c58a75bace8941c14c924b9f313b03ce5029ebbc040ed9dcd9
 * localhost:5000/mockdeploy-htws@sha256:899a03e9816e5283edba63d71ea528cd83576b28a7586cf617ce78af5526f209
 * ```
 * @public
 */
export declare type ImageNameString = NameTagString | RepoDigestString;
/**
 * A string that references a Docker registry that contains a hostname and
 * may optionally contain a port and/or path.
 *
 * @remarks
 * This string is in the form of one of:
 * ```
 * hostname[:port]
 * hostname[:port]/path
 * ```
 * This form does not include the protocol, such as `http:` or `https:` in
 * the string.
 *
 * @public
 */
export declare type RegistryString = string;
/**
 * Information about a specific instance of a Docker image, as identified by
 * its image ID.
 * @deprecated Replaced with {@link docker.ImageRef}.
 * @public
 */
export interface ImageInfo {
    /**
     * Docker image ID, in the form `algorithm:hex`.
     * @remarks
     * See {@link docker.ImageIdString}.
     */
    id: ImageIdString;
    /**
     * Docker image name and optional tag in the form `name` or `name:tag`.
     * @remarks
     * See {@link docker.NameTagString}
     */
    nameTag?: NameTagString;
}
/**
 * Props for {@link docker.DockerContainer}
 *
 * @public
 */
export interface DockerContainerProps extends DockerGlobalOptions, Pick<ContainerProps, "autoRemove" | "command" | "environment" | "portBindings" | "ports" | "restartPolicy" | "stopSignal"> {
    /** image name as a string, or a handle to a DockerImage component */
    image: ImageNameString | Handle<DockerImageInstance>;
    /**
     * Host and port of the remote docker host to use.
     *
     * @remarks
     * Defaults to the DOCKER_HOST environment variable
     */
    dockerHost: string;
    /**
     * Labels to apply to the container.
     */
    labels?: ContainerLabels;
    /**
     * Filesystems to be mounted in the container.
     */
    mounts?: Mount[];
    /**
     * Networks to connect the container to
     *
     * @remarks
     * Accepts the same strings as docker network connect
     */
    networks?: string[];
    /**
     * Enables the container to run in privileged mode.
     */
    privileged?: boolean;
}
/**
 * Represents a split registry, with pushes going to external and pulls going to internal
 * @beta
 */
export interface DockerSplitRegistryInfo {
    external: string;
    internal: string;
}
/**
 * Describes bind mount filesystems to be mounted in a container.
 * @public
 */
export interface BindMount {
    type: "bind";
    source: string;
    destination: string;
    readonly?: boolean;
    propagation?: "shared" | "slave" | "private" | "rshared" | "rslave" | "rprivate";
}
/**
 * Describes filesystems to be mounted in a container.
 * @public
 */
export declare type Mount = BindMount;
//# sourceMappingURL=types.d.ts.map