From 8a3dff26c3f127175c987b451434482c16a21291 Mon Sep 17 00:00:00 2001 From: Richard Cunningham Date: Tue, 19 Nov 2024 10:54:08 +0000 Subject: [PATCH 01/11] Initial commit --- src/color/README.md | 26 ------------ src/color/devcontainer-feature.json | 21 --------- src/color/install.sh | 26 ------------ src/devcontainer-rc/install.sh | 66 +++++++++++++++++++++++++++++ src/hello/README.md | 26 ------------ src/hello/devcontainer-feature.json | 22 ---------- src/hello/install.sh | 29 ------------- 7 files changed, 66 insertions(+), 150 deletions(-) delete mode 100644 src/color/README.md delete mode 100644 src/color/devcontainer-feature.json delete mode 100644 src/color/install.sh create mode 100644 src/devcontainer-rc/install.sh delete mode 100644 src/hello/README.md delete mode 100644 src/hello/devcontainer-feature.json delete mode 100644 src/hello/install.sh diff --git a/src/color/README.md b/src/color/README.md deleted file mode 100644 index a1e7d1b..0000000 --- a/src/color/README.md +++ /dev/null @@ -1,26 +0,0 @@ - -# My Favorite Color (color) - -A feature to remind you of your favorite color - -## Example Usage - -```json -"features": { - "ghcr.io/devcontainers/feature-starter/color:1": { - "version": "latest" - } -} -``` - -## Options - -| Options Id | Description | Type | Default Value | -|-----|-----|-----|-----| -| favorite | Choose your favorite color. | string | red | - - - ---- - -_Note: This file was auto-generated from the [devcontainer-feature.json](https://github.com/devcontainers/feature-starter/blob/main/src/color/devcontainer-feature.json). Add additional notes to a `NOTES.md`._ diff --git a/src/color/devcontainer-feature.json b/src/color/devcontainer-feature.json deleted file mode 100644 index e14e7e7..0000000 --- a/src/color/devcontainer-feature.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "My Favorite Color", - "id": "color", - "version": "1.0.3", - "description": "A feature to remind you of your favorite color", - "options": { - "favorite": { - "type": "string", - "enum": [ - "red", - "gold", - "green" - ], - "default": "red", - "description": "Choose your favorite color." - } - }, - "installsAfter": [ - "ghcr.io/devcontainers/features/common-utils" - ] -} diff --git a/src/color/install.sh b/src/color/install.sh deleted file mode 100644 index 883c25d..0000000 --- a/src/color/install.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh -set -e - -echo "Activating feature 'color'" -echo "The provided favorite color is: ${FAVORITE}" - - -# The 'install.sh' entrypoint script is always executed as the root user. -# -# These following environment variables are passed in by the dev container CLI. -# These may be useful in instances where the context of the final -# remoteUser or containerUser is useful. -# For more details, see https://containers.dev/implementors/features#user-env-var -echo "The effective dev container remoteUser is '$_REMOTE_USER'" -echo "The effective dev container remoteUser's home directory is '$_REMOTE_USER_HOME'" - -echo "The effective dev container containerUser is '$_CONTAINER_USER'" -echo "The effective dev container containerUser's home directory is '$_CONTAINER_USER_HOME'" - -cat > /usr/local/bin/color \ -<< EOF -#!/bin/sh -echo "my favorite color is ${FAVORITE}" -EOF - -chmod +x /usr/local/bin/color diff --git a/src/devcontainer-rc/install.sh b/src/devcontainer-rc/install.sh new file mode 100644 index 0000000..43905c8 --- /dev/null +++ b/src/devcontainer-rc/install.sh @@ -0,0 +1,66 @@ +#!/bin/bash + +mkdir -p $CONFIG_STAGING + +# ------------------------------------------------------------------------------- +cat > $CONFIG_STAGING/onCreateCommand.sh \ +<< EOF +#!/bin/bash + +# copy in the opinionated default settings from the feature +cp $CONFIG_STAGING/feature_settings_rc $CONFIG_FOLDER/feature_settings_rc + +# copy in the user editable settings unless they already exist +if [[ ! -f $CONFIG_FOLDER/bashrc ]] ; then + cp $CONFIG_STAGING/bashrc $CONFIG_FOLDER + cp $CONFIG_STAGING/inputrc $CONFIG_FOLDER +fi + +# hook in the config to the root account +ln -s $CONFIG_FOLDER/inputrc /root/.inputrc +echo "source $CONFIG_FOLDER/bashrc" >> /root/.bashrc +EOF + +# ------------------------------------------------------------------------------- +cat > $CONFIG_STAGING/inputrc \ +<< EOF +# Readline configuration for bash shell. + +# Incremental history searching with up and down arrows (C-P and C-N for old +# style navigation). +"\e[A": history-search-backward +"\e[B": history-search-forward + +# Control left and right for word movement +"\e[5C": forward-word +"\e[5D": backward-word +EOF + +# ------------------------------------------------------------------------------- +cat > $CONFIG_STAGING/bashrc \ +<< EOF +#!/bin/bash + +# execute default opinionated settings - delete this line to remove defaults +source $CONFIG_FOLDER/feature_settings_rc + +# add your personal custom settings below +EOF + +# ------------------------------------------------------------------------------- +cat > $CONFIG_STAGING/feature_settings_rc \ +<< EOF +#!/bin/bash + +# default opinioned bash configuration + +# set the prompt +export PS1="\[\033[1;34m\]\W \[\033[0m\]# " + +# enable enternal shared history +export HISTCONTROL=ignoreboth:erasedups +export HISTFILESIZE=-1 +export SAVEHIST=-1 +export HISTFILE=$CONFIG_FOLDER/.bash_eternal_history +PROMPT_COMMAND="history -a; $PROMPT_COMMAND" +EOF diff --git a/src/hello/README.md b/src/hello/README.md deleted file mode 100644 index 142e101..0000000 --- a/src/hello/README.md +++ /dev/null @@ -1,26 +0,0 @@ - -# Hello, World! (hello) - -A hello world feature - -## Example Usage - -```json -"features": { - "ghcr.io/devcontainers/feature-starter/hello:1": { - "version": "latest" - } -} -``` - -## Options - -| Options Id | Description | Type | Default Value | -|-----|-----|-----|-----| -| greeting | Select a pre-made greeting, or enter your own | string | hey | - - - ---- - -_Note: This file was auto-generated from the [devcontainer-feature.json](https://github.com/devcontainers/feature-starter/blob/main/src/hello/devcontainer-feature.json). Add additional notes to a `NOTES.md`._ diff --git a/src/hello/devcontainer-feature.json b/src/hello/devcontainer-feature.json deleted file mode 100644 index e2a3178..0000000 --- a/src/hello/devcontainer-feature.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "Hello, World!", - "id": "hello", - "version": "1.0.2", - "description": "A hello world feature", - "options": { - "greeting": { - "type": "string", - "proposals": [ - "hey", - "hello", - "hi", - "howdy" - ], - "default": "hey", - "description": "Select a pre-made greeting, or enter your own" - } - }, - "installsAfter": [ - "ghcr.io/devcontainers/features/common-utils" - ] -} diff --git a/src/hello/install.sh b/src/hello/install.sh deleted file mode 100644 index 480e262..0000000 --- a/src/hello/install.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -set -e - -echo "Activating feature 'hello'" - -GREETING=${GREETING:-undefined} -echo "The provided greeting is: $GREETING" - -# The 'install.sh' entrypoint script is always executed as the root user. -# -# These following environment variables are passed in by the dev container CLI. -# These may be useful in instances where the context of the final -# remoteUser or containerUser is useful. -# For more details, see https://containers.dev/implementors/features#user-env-var -echo "The effective dev container remoteUser is '$_REMOTE_USER'" -echo "The effective dev container remoteUser's home directory is '$_REMOTE_USER_HOME'" - -echo "The effective dev container containerUser is '$_CONTAINER_USER'" -echo "The effective dev container containerUser's home directory is '$_CONTAINER_USER_HOME'" - -cat > /usr/local/bin/hello \ -<< EOF -#!/bin/sh -RED='\033[0;91m' -NC='\033[0m' # No Color -echo "\${RED}${GREETING}, \$(whoami)!\${NC}" -EOF - -chmod +x /usr/local/bin/hello \ No newline at end of file From 777d821e729c69a0622338c02aed9a6ab11dde6d Mon Sep 17 00:00:00 2001 From: Richard Cunningham Date: Tue, 19 Nov 2024 11:06:11 +0000 Subject: [PATCH 02/11] Add BASH history feature --- .../devcontainer-feature.json | 25 +++++++ src/terminal-history/install.sh | 66 +++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 src/terminal-history/devcontainer-feature.json create mode 100644 src/terminal-history/install.sh diff --git a/src/terminal-history/devcontainer-feature.json b/src/terminal-history/devcontainer-feature.json new file mode 100644 index 0000000..8145d62 --- /dev/null +++ b/src/terminal-history/devcontainer-feature.json @@ -0,0 +1,25 @@ +{ + "name": "BASH terminal auto history configuration", + "id": "BASH", + "version": "1.0.0", + "containerEnv": { + "CONFIG_FOLDER": "/devcontainer_rc", + "CONFIG_STAGING": "/devcontainer_staging" + }, + "description": "Make default BASH terminal nicer.", + // "options": { + // "host_config_folder": { + // "type": "string", + // "default": "${localEnv:HOME}/.config/devcontainer_rc", + // "description": "host folder for devcontainer shell configuration" + // } + // }, + "mounts": [ + { + "source": "${localEnv:HOME}/.config/devcontainer_rc", + "target": "/devcontainer_rc", + "type": "bind" + } + ], + "onCreateCommand": "bash /devcontainer_staging/onCreateCommand.sh" +} diff --git a/src/terminal-history/install.sh b/src/terminal-history/install.sh new file mode 100644 index 0000000..43905c8 --- /dev/null +++ b/src/terminal-history/install.sh @@ -0,0 +1,66 @@ +#!/bin/bash + +mkdir -p $CONFIG_STAGING + +# ------------------------------------------------------------------------------- +cat > $CONFIG_STAGING/onCreateCommand.sh \ +<< EOF +#!/bin/bash + +# copy in the opinionated default settings from the feature +cp $CONFIG_STAGING/feature_settings_rc $CONFIG_FOLDER/feature_settings_rc + +# copy in the user editable settings unless they already exist +if [[ ! -f $CONFIG_FOLDER/bashrc ]] ; then + cp $CONFIG_STAGING/bashrc $CONFIG_FOLDER + cp $CONFIG_STAGING/inputrc $CONFIG_FOLDER +fi + +# hook in the config to the root account +ln -s $CONFIG_FOLDER/inputrc /root/.inputrc +echo "source $CONFIG_FOLDER/bashrc" >> /root/.bashrc +EOF + +# ------------------------------------------------------------------------------- +cat > $CONFIG_STAGING/inputrc \ +<< EOF +# Readline configuration for bash shell. + +# Incremental history searching with up and down arrows (C-P and C-N for old +# style navigation). +"\e[A": history-search-backward +"\e[B": history-search-forward + +# Control left and right for word movement +"\e[5C": forward-word +"\e[5D": backward-word +EOF + +# ------------------------------------------------------------------------------- +cat > $CONFIG_STAGING/bashrc \ +<< EOF +#!/bin/bash + +# execute default opinionated settings - delete this line to remove defaults +source $CONFIG_FOLDER/feature_settings_rc + +# add your personal custom settings below +EOF + +# ------------------------------------------------------------------------------- +cat > $CONFIG_STAGING/feature_settings_rc \ +<< EOF +#!/bin/bash + +# default opinioned bash configuration + +# set the prompt +export PS1="\[\033[1;34m\]\W \[\033[0m\]# " + +# enable enternal shared history +export HISTCONTROL=ignoreboth:erasedups +export HISTFILESIZE=-1 +export SAVEHIST=-1 +export HISTFILE=$CONFIG_FOLDER/.bash_eternal_history +PROMPT_COMMAND="history -a; $PROMPT_COMMAND" +EOF From 9aef85f7282b6d0a46d36291b187ebca0a6478df Mon Sep 17 00:00:00 2001 From: Richard Cunningham Date: Tue, 19 Nov 2024 11:12:03 +0000 Subject: [PATCH 03/11] temp ignore default tests --- .github/workflows/test.yaml | 116 ++++++++++++++++++------------------ 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 4033ca9..e0854f9 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -1,58 +1,58 @@ -name: "CI - Test Features" -on: - push: - branches: - - main - pull_request: - workflow_dispatch: - -jobs: - test-autogenerated: - runs-on: ubuntu-latest - continue-on-error: true - strategy: - matrix: - features: - - color - - hello - baseImage: - - debian:latest - - ubuntu:latest - - mcr.microsoft.com/devcontainers/base:ubuntu - steps: - - uses: actions/checkout@v4 - - - name: "Install latest devcontainer CLI" - run: npm install -g @devcontainers/cli - - - name: "Generating tests for '${{ matrix.features }}' against '${{ matrix.baseImage }}'" - run: devcontainer features test --skip-scenarios -f ${{ matrix.features }} -i ${{ matrix.baseImage }} . - - test-scenarios: - runs-on: ubuntu-latest - continue-on-error: true - strategy: - matrix: - features: - - color - - hello - steps: - - uses: actions/checkout@v4 - - - name: "Install latest devcontainer CLI" - run: npm install -g @devcontainers/cli - - - name: "Generating tests for '${{ matrix.features }}' scenarios" - run: devcontainer features test -f ${{ matrix.features }} --skip-autogenerated --skip-duplicated . - - test-global: - runs-on: ubuntu-latest - continue-on-error: true - steps: - - uses: actions/checkout@v4 - - - name: "Install latest devcontainer CLI" - run: npm install -g @devcontainers/cli - - - name: "Testing global scenarios" - run: devcontainer features test --global-scenarios-only . +# name: "CI - Test Features" +# on: +# push: +# branches: +# - main +# pull_request: +# workflow_dispatch: + +# jobs: +# test-autogenerated: +# runs-on: ubuntu-latest +# continue-on-error: true +# strategy: +# matrix: +# features: +# - color +# - hello +# baseImage: +# - debian:latest +# - ubuntu:latest +# - mcr.microsoft.com/devcontainers/base:ubuntu +# steps: +# - uses: actions/checkout@v4 + +# - name: "Install latest devcontainer CLI" +# run: npm install -g @devcontainers/cli + +# - name: "Generating tests for '${{ matrix.features }}' against '${{ matrix.baseImage }}'" +# run: devcontainer features test --skip-scenarios -f ${{ matrix.features }} -i ${{ matrix.baseImage }} . + +# test-scenarios: +# runs-on: ubuntu-latest +# continue-on-error: true +# strategy: +# matrix: +# features: +# - color +# - hello +# steps: +# - uses: actions/checkout@v4 + +# - name: "Install latest devcontainer CLI" +# run: npm install -g @devcontainers/cli + +# - name: "Generating tests for '${{ matrix.features }}' scenarios" +# run: devcontainer features test -f ${{ matrix.features }} --skip-autogenerated --skip-duplicated . + +# test-global: +# runs-on: ubuntu-latest +# continue-on-error: true +# steps: +# - uses: actions/checkout@v4 + +# - name: "Install latest devcontainer CLI" +# run: npm install -g @devcontainers/cli + +# - name: "Testing global scenarios" +# run: devcontainer features test --global-scenarios-only . From aacd91e29aa34098b882e451c8c663309910e4fe Mon Sep 17 00:00:00 2001 From: Richard Cunningham Date: Tue, 19 Nov 2024 11:22:18 +0000 Subject: [PATCH 04/11] Autogen test for terminal-history --- .github/workflows/test.yaml | 115 ++++++++++++++++++------------------ 1 file changed, 57 insertions(+), 58 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index e0854f9..018eadd 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -1,58 +1,57 @@ -# name: "CI - Test Features" -# on: -# push: -# branches: -# - main -# pull_request: -# workflow_dispatch: - -# jobs: -# test-autogenerated: -# runs-on: ubuntu-latest -# continue-on-error: true -# strategy: -# matrix: -# features: -# - color -# - hello -# baseImage: -# - debian:latest -# - ubuntu:latest -# - mcr.microsoft.com/devcontainers/base:ubuntu -# steps: -# - uses: actions/checkout@v4 - -# - name: "Install latest devcontainer CLI" -# run: npm install -g @devcontainers/cli - -# - name: "Generating tests for '${{ matrix.features }}' against '${{ matrix.baseImage }}'" -# run: devcontainer features test --skip-scenarios -f ${{ matrix.features }} -i ${{ matrix.baseImage }} . - -# test-scenarios: -# runs-on: ubuntu-latest -# continue-on-error: true -# strategy: -# matrix: -# features: -# - color -# - hello -# steps: -# - uses: actions/checkout@v4 - -# - name: "Install latest devcontainer CLI" -# run: npm install -g @devcontainers/cli - -# - name: "Generating tests for '${{ matrix.features }}' scenarios" -# run: devcontainer features test -f ${{ matrix.features }} --skip-autogenerated --skip-duplicated . - -# test-global: -# runs-on: ubuntu-latest -# continue-on-error: true -# steps: -# - uses: actions/checkout@v4 - -# - name: "Install latest devcontainer CLI" -# run: npm install -g @devcontainers/cli - -# - name: "Testing global scenarios" -# run: devcontainer features test --global-scenarios-only . +name: "CI - Test Features" +on: + push: + branches: + - main + pull_request: + workflow_dispatch: + +jobs: + test-autogenerated: + runs-on: ubuntu-latest + continue-on-error: true + strategy: + matrix: + features: + - terminal-history + baseImage: + - debian:latest + - ubuntu:latest + - mcr.microsoft.com/devcontainers/base:ubuntu + steps: + - uses: actions/checkout@v4 + + - name: "Install latest devcontainer CLI" + run: npm install -g @devcontainers/cli + + - name: "Generating tests for '${{ matrix.features }}' against '${{ matrix.baseImage }}'" + run: devcontainer features test --skip-scenarios -f ${{ matrix.features }} -i ${{ matrix.baseImage }} . + +# test-scenarios: +# runs-on: ubuntu-latest +# continue-on-error: true +# strategy: +# matrix: +# features: +# - color +# - hello +# steps: +# - uses: actions/checkout@v4 +# +# - name: "Install latest devcontainer CLI" +# run: npm install -g @devcontainers/cli +# +# - name: "Generating tests for '${{ matrix.features }}' scenarios" +# run: devcontainer features test -f ${{ matrix.features }} --skip-autogenerated --skip-duplicated . +# +# test-global: +# runs-on: ubuntu-latest +# continue-on-error: true +# steps: +# - uses: actions/checkout@v4 +# +# - name: "Install latest devcontainer CLI" +# run: npm install -g @devcontainers/cli +# +# - name: "Testing global scenarios" +# run: devcontainer features test --global-scenarios-only . From 5a45e182331237f382ef3551f610ee0588b5ddf9 Mon Sep 17 00:00:00 2001 From: Richard Cunningham Date: Tue, 19 Nov 2024 11:43:26 +0000 Subject: [PATCH 05/11] Add host folder for feature mount --- .github/workflows/test.yaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 018eadd..b718a5c 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -22,8 +22,10 @@ jobs: - uses: actions/checkout@v4 - name: "Install latest devcontainer CLI" - run: npm install -g @devcontainers/cli - + run: | + npm install -g @devcontainers/cli + mkdir -p ~/.config/devcontainer_rc + - name: "Generating tests for '${{ matrix.features }}' against '${{ matrix.baseImage }}'" run: devcontainer features test --skip-scenarios -f ${{ matrix.features }} -i ${{ matrix.baseImage }} . From a7da5b02439afa1643572aeb411c07e8f4511bc4 Mon Sep 17 00:00:00 2001 From: Richard Cunningham Date: Tue, 19 Nov 2024 11:48:40 +0000 Subject: [PATCH 06/11] Add dummy test --- src/devcontainer-rc/install.sh | 66 ---------------------------------- test/terminal-history/test.sh | 47 ++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 66 deletions(-) delete mode 100644 src/devcontainer-rc/install.sh create mode 100644 test/terminal-history/test.sh diff --git a/src/devcontainer-rc/install.sh b/src/devcontainer-rc/install.sh deleted file mode 100644 index 43905c8..0000000 --- a/src/devcontainer-rc/install.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/bash - -mkdir -p $CONFIG_STAGING - -# ------------------------------------------------------------------------------- -cat > $CONFIG_STAGING/onCreateCommand.sh \ -<< EOF -#!/bin/bash - -# copy in the opinionated default settings from the feature -cp $CONFIG_STAGING/feature_settings_rc $CONFIG_FOLDER/feature_settings_rc - -# copy in the user editable settings unless they already exist -if [[ ! -f $CONFIG_FOLDER/bashrc ]] ; then - cp $CONFIG_STAGING/bashrc $CONFIG_FOLDER - cp $CONFIG_STAGING/inputrc $CONFIG_FOLDER -fi - -# hook in the config to the root account -ln -s $CONFIG_FOLDER/inputrc /root/.inputrc -echo "source $CONFIG_FOLDER/bashrc" >> /root/.bashrc -EOF - -# ------------------------------------------------------------------------------- -cat > $CONFIG_STAGING/inputrc \ -<< EOF -# Readline configuration for bash shell. - -# Incremental history searching with up and down arrows (C-P and C-N for old -# style navigation). -"\e[A": history-search-backward -"\e[B": history-search-forward - -# Control left and right for word movement -"\e[5C": forward-word -"\e[5D": backward-word -EOF - -# ------------------------------------------------------------------------------- -cat > $CONFIG_STAGING/bashrc \ -<< EOF -#!/bin/bash - -# execute default opinionated settings - delete this line to remove defaults -source $CONFIG_FOLDER/feature_settings_rc - -# add your personal custom settings below -EOF - -# ------------------------------------------------------------------------------- -cat > $CONFIG_STAGING/feature_settings_rc \ -<< EOF -#!/bin/bash - -# default opinioned bash configuration - -# set the prompt -export PS1="\[\033[1;34m\]\W \[\033[0m\]# " - -# enable enternal shared history -export HISTCONTROL=ignoreboth:erasedups -export HISTFILESIZE=-1 -export SAVEHIST=-1 -export HISTFILE=$CONFIG_FOLDER/.bash_eternal_history -PROMPT_COMMAND="history -a; $PROMPT_COMMAND" -EOF diff --git a/test/terminal-history/test.sh b/test/terminal-history/test.sh new file mode 100644 index 0000000..c7c1cec --- /dev/null +++ b/test/terminal-history/test.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# This test file will be executed against an auto-generated devcontainer.json that +# includes the 'hello' Feature with no options. +# +# For more information, see: https://github.com/devcontainers/cli/blob/main/docs/features/test.md +# +# Eg: +# { +# "image": "<..some-base-image...>", +# "features": { +# "hello": {} +# }, +# "remoteUser": "root" +# } +# +# Thus, the value of all options will fall back to the default value in +# the Feature's 'devcontainer-feature.json'. +# For the 'hello' feature, that means the default favorite greeting is 'hey'. +# +# These scripts are run as 'root' by default. Although that can be changed +# with the '--remote-user' flag. +# +# This test can be run with the following command: +# +# devcontainer features test \ +# --features hello \ +# --remote-user root \ +# --skip-scenarios \ +# --base-image mcr.microsoft.com/devcontainers/base:ubuntu \ +# /path/to/this/repo + +set -e + +# Optional: Import test library bundled with the devcontainer CLI +# See https://github.com/devcontainers/cli/blob/HEAD/docs/features/test.md#dev-container-features-test-lib +# Provides the 'check' and 'reportResults' commands. +source dev-container-features-test-lib + +# Feature-specific tests +# The 'check' command comes from the dev-container-features-test-lib. Syntax is... +# check