UNPKG

@augment-vir/node

Version:

A collection of augments, helpers types, functions, and classes only for Node.js (backend) JavaScript environments.

69 lines (68 loc) 3.11 kB
import { assert, waitUntil } from '@augment-vir/assert'; import { runShellCommand } from '../../augments/terminal/shell.js'; export async function getContainerLogs(containerNameOrId, latestLineCount) { const latestLinesArg = latestLineCount == undefined ? '' : `--tail ${latestLineCount}`; const logResult = await runShellCommand(`docker logs ${latestLinesArg} '${containerNameOrId}'`, { rejectOnError: true }); return logResult.stdout; } /** * All possible statuses for an existing container. * * @category Node : Docker : Util * @category Package : @augment-vir/node * @package [`@augment-vir/node`](https://www.npmjs.com/package/@augment-vir/node) */ export var DockerContainerStatus; (function (DockerContainerStatus) { DockerContainerStatus["Created"] = "created"; DockerContainerStatus["Running"] = "running"; DockerContainerStatus["Paused"] = "paused"; DockerContainerStatus["Restarting"] = "restarting"; DockerContainerStatus["Exited"] = "exited"; DockerContainerStatus["Removing"] = "removing"; DockerContainerStatus["Dead"] = "dead"; /** This is not a native Docker status but indicates that the container does not exist. */ DockerContainerStatus["Removed"] = "removed"; })(DockerContainerStatus || (DockerContainerStatus = {})); /** * Statuses from {@link DockerContainerStatus} that indicate that a container has been exited in some * way. * * @category Node : Docker : Util * @category Package : @augment-vir/node * @package [`@augment-vir/node`](https://www.npmjs.com/package/@augment-vir/node) */ export const exitedDockerContainerStatuses = [ DockerContainerStatus.Dead, DockerContainerStatus.Removed, DockerContainerStatus.Exited, ]; export async function getContainerStatus(containerNameOrId) { const statusResult = await runShellCommand(`docker container inspect -f '{{.State.Status}}' '${containerNameOrId}'`); if (statusResult.exitCode !== 0) { return DockerContainerStatus.Removed; } const status = statusResult.stdout.trim(); assert.isEnumValue(status, DockerContainerStatus, 'Unexpected container status value'); return status; } export async function waitUntilContainerRunning(containerNameOrId, failureMessage) { await waitUntil.isTrue(async () => { /** Check if logs can be accessed yet. */ await getContainerLogs(containerNameOrId, 1); const status = await getContainerStatus(containerNameOrId); return status === DockerContainerStatus.Running; }, {}, failureMessage); } export async function waitUntilContainerRemoved(containerNameOrId, failureMessage) { await waitUntil.isTrue(async () => { const status = await getContainerStatus(containerNameOrId); return status === DockerContainerStatus.Removed; }, {}, failureMessage); } export async function waitUntilContainerExited(containerNameOrId, failureMessage) { await waitUntil.isTrue(async () => { const status = await getContainerStatus(containerNameOrId); return exitedDockerContainerStatuses.includes(status); }, {}, failureMessage); }