From b06d833012920f1983d46e817856e211db9f40ba Mon Sep 17 00:00:00 2001 From: Edward Angert Date: Mon, 2 Dec 2024 12:19:04 -0500 Subject: [PATCH] docs: improve dev containers documentation for user start-up (#15458) - [x] TODO: verify and expand [What is an image, template, devcontainer, or workspace](https://coder.com/docs/@bp-dev-containers/admin#what-is-an-image-template-devcontainer-or-workspace) - [x] TODO: verify and expand `## Add a devcontainer template to Coder` - [x] TODO: verify and expand `## Layer and image caching` - [x] TODO: link to and edit [dotfiles](https://coder.com/docs/user-guides/workspace-dotfiles) doc - [x] TODO: https://github.com/coder/coder/pull/15458/files#diff-be0dd9ff983020129c7a94c628a0fc4a397a9bbc8b5eec92ec38f4b8c83fe167R10 [preview](https://coder.com/docs/@bp-dev-containers/admin/templates/managing-templates/devcontainers) --------- Co-authored-by: EdwardAngert <17991901+EdwardAngert@users.noreply.github.com> Co-authored-by: Cian Johnston Co-authored-by: Ben Potter Co-authored-by: Edward Angert <2408959-EdwardAngert@users.noreply.gitlab.com> Co-authored-by: Muhammad Atif Ali --- docs/admin/index.md | 52 ++++++ docs/admin/templates/index.md | 4 +- .../managing-templates/devcontainers.md | 112 ------------- .../devcontainers/add-devcontainer.md | 150 ++++++++++++++++++ .../devcontainer-releases-known-issues.md | 25 +++ .../devcontainer-security-caching.md | 66 ++++++++ .../managing-templates/devcontainers/index.md | 122 ++++++++++++++ .../managing-templates/image-management.md | 4 +- .../templates/managing-templates/index.md | 2 +- .../templates/template-menu-settings.png | Bin 0 -> 14884 bytes docs/manifest.json | 23 ++- 11 files changed, 440 insertions(+), 120 deletions(-) delete mode 100644 docs/admin/templates/managing-templates/devcontainers.md create mode 100644 docs/admin/templates/managing-templates/devcontainers/add-devcontainer.md create mode 100644 docs/admin/templates/managing-templates/devcontainers/devcontainer-releases-known-issues.md create mode 100644 docs/admin/templates/managing-templates/devcontainers/devcontainer-security-caching.md create mode 100644 docs/admin/templates/managing-templates/devcontainers/index.md create mode 100644 docs/images/templates/template-menu-settings.png diff --git a/docs/admin/index.md b/docs/admin/index.md index 6ef0e6fb65..a1552bcf22 100644 --- a/docs/admin/index.md +++ b/docs/admin/index.md @@ -15,4 +15,56 @@ and [API](../reference/api/index.md) docs. For any information not strictly contained in these sections, check out our [Tutorials](../tutorials/index.md) and [FAQs](../tutorials/faqs.md). +## What is an image, template, dev container, or workspace + +**Image** + +- A [base image](./templates/managing-templates/image-management.md) contains + OS-level packages and utilities that the Coder workspace is built on. It can + be an [example image](https://github.com/coder/images), custom image in your + registry, or one from [Docker Hub](https://hub.docker.com/search). It is + defined in each template. +- Managed by: Externally to Coder. + +**Template** + +- [Templates](./templates/index.md) include infrastructure-level dependencies + for the workspace. For example, a template can include Kubernetes + PersistentVolumeClaims, Docker containers, or EC2 VMs. +- Managed by: Template administrators from within the Coder deployment. + +**Startup scripts** + +- Agent startup scripts apply to all users of a template. This is an + intentionally flexible area that template authors have at their disposal to + manage the "last mile" of workspace creation. +- Managed by: Coder template administrators. + +**Workspace** + +- A [workspace](../user-guides/workspace-management.md) is the environment that + a developer works in. Developers on a team each work from their own workspace + and can use [multiple IDEs](../user-guides/workspace-access/index.md). +- Managed by: Developers + +**Development containers (dev containers)** + +- A + [Development Container](./templates/managing-templates/devcontainers/index.md) + is an open-source specification for defining development environments (called + dev containers). It is generally stored in VCS alongside associated source + code. It can reference an existing base image, or a custom Dockerfile that + will be built on-demand. +- Managed by: Dev Teams + +**Dotfiles / personalization** + +- Users may have their own specific preferences relating to shell prompt, custom + keybindings, color schemes, and more. Users can leverage Coder's + [dotfiles support](../user-guides/workspace-dotfiles.md) or create their own + script to personalize their workspace. Be aware that users with root + permissions in their workspace can override almost all of the previous + configuration. +- Managed by: Individual Users + diff --git a/docs/admin/templates/index.md b/docs/admin/templates/index.md index ad9c3ef965..85f2769e88 100644 --- a/docs/admin/templates/index.md +++ b/docs/admin/templates/index.md @@ -48,8 +48,8 @@ needs of different teams. - [Image management](./managing-templates/image-management.md): Learn how to create and publish images for use within Coder workspaces & templates. -- [Dev Container support](./managing-templates/devcontainers.md): Enable dev - containers to allow teams to bring their own tools into Coder workspaces. +- [Dev Container support](./managing-templates/devcontainers/index.md): Enable + dev containers to allow teams to bring their own tools into Coder workspaces. - [Template hardening](./extending-templates/resource-persistence.md#-bulletproofing): Configure your template to prevent certain resources from being destroyed (e.g. user disks). diff --git a/docs/admin/templates/managing-templates/devcontainers.md b/docs/admin/templates/managing-templates/devcontainers.md deleted file mode 100644 index 088f733adc..0000000000 --- a/docs/admin/templates/managing-templates/devcontainers.md +++ /dev/null @@ -1,112 +0,0 @@ -# Dev Containers - -[Development containers](https://containers.dev) are an open source -specification for defining development environments. - -[Envbuilder](https://github.com/coder/envbuilder) is an open source project by -Coder that runs dev containers via Coder templates and your underlying -infrastructure. It can run on Docker or Kubernetes. - -There are several benefits to adding a devcontainer-compatible template to -Coder: - -- Drop-in migration from Codespaces (or any existing repositories that use dev - containers) -- Easier to start projects from Coder. Just create a new workspace then pick a - starter devcontainer. -- Developer teams can "bring their own image." No need for platform teams to - manage complex images, registries, and CI pipelines. - -## How it works - -A Coder admin adds a devcontainer-compatible template to Coder (envbuilder). -Then developers enter their repository URL as a -[parameter](../extending-templates/parameters.md) when they create their -workspace. [Envbuilder](https://github.com/coder/envbuilder) clones the repo and -builds a container from the `devcontainer.json` specified in the repo. - -When using the [Envbuilder Terraform provider](#envbuilder-terraform-provider), -a previously built and cached image can be re-used directly, allowing -instantaneous dev container starts. - -Developers can edit the `devcontainer.json` in their workspace to rebuild to -iterate on their development environments. - -## Example templates - -- [Devcontainers (Docker)](https://github.com/coder/coder/tree/main/examples/templates/devcontainer-docker) - provisions a development container using Docker. -- [Devcontainers (Kubernetes)](https://github.com/coder/coder/tree/main/examples/templates/devcontainer-kubernetes) - provisions a development container on the Kubernetes. -- [Google Compute Engine (Devcontainer)](https://github.com/coder/coder/tree/main/examples/templates/gcp-devcontainer) - runs a development container inside a single GCP instance. It also mounts the - Docker socket from the VM inside the container to enable Docker inside the - workspace. -- [AWS EC2 (Devcontainer)](https://github.com/coder/coder/tree/main/examples/templates/aws-devcontainer) - runs a development container inside a single EC2 instance. It also mounts the - Docker socket from the VM inside the container to enable Docker inside the - workspace. - -![Devcontainer parameter screen](../../../images/templates/devcontainers.png) - -Your template can prompt the user for a repo URL with -[Parameters](../extending-templates/parameters.md). - -## Authentication - -You may need to authenticate to your container registry, such as Artifactory, or -git provider such as GitLab, to use Envbuilder. See the -[Envbuilder documentation](https://github.com/coder/envbuilder/blob/main/docs/container-registry-auth.md) -for more information. - -## Caching - -To improve build times, dev containers can be cached. There are two main forms -of caching: - -1. **Layer Caching** caches individual layers and pushes them to a remote - registry. When building the image, Envbuilder will check the remote registry - for pre-existing layers. These will be fetched and extracted to disk instead - of building the layers from scratch. -2. **Image Caching** caches the _entire image_, skipping the build process - completely (except for post-build lifecycle scripts). - -Refer to the -[Envbuilder documentation](https://github.com/coder/envbuilder/blob/main/docs/caching.md) -for more information. - -## Envbuilder Terraform Provider - -To support resuming from a cached image, use the -[Envbuilder Terraform Provider](https://github.com/coder/terraform-provider-envbuilder) -in your template. The provider will: - -1. Clone the remote Git repository, -2. Perform a 'dry-run' build of the dev container in the same manner as - Envbuilder would, -3. Check for the presence of a previously built image in the provided cache - repository, -4. Output the image remote reference in SHA256 form, if found. - -The above example templates will use the provider if a remote cache repository -is provided. - -If you are building your own Devcontainer template, you can consult the -[provider documentation](https://registry.terraform.io/providers/coder/envbuilder/latest/docs/resources/cached_image). -You may also wish to consult a -[documented example usage of the `envbuilder_cached_image` resource](https://github.com/coder/terraform-provider-envbuilder/blob/main/examples/resources/envbuilder_cached_image/envbuilder_cached_image_resource.tf). - -## Other features & known issues - -Envbuilder provides two release channels: - -- **Stable:** available at - [`ghcr.io/coder/envbuilder`](https://github.com/coder/envbuilder/pkgs/container/envbuilder). - Tags `>=1.0.0` are considered stable. -- **Preview:** available at - [`ghcr.io/coder/envbuilder-preview`](https://github.com/coder/envbuilder/pkgs/container/envbuilder-preview). - This is built from the tip of `main`, and should be considered - **experimental** and prone to **breaking changes**. - -Refer to the [Envbuilder GitHub repo](https://github.com/coder/envbuilder/) for -more information and to submit feature requests or bug reports. diff --git a/docs/admin/templates/managing-templates/devcontainers/add-devcontainer.md b/docs/admin/templates/managing-templates/devcontainers/add-devcontainer.md new file mode 100644 index 0000000000..18dabcf2b2 --- /dev/null +++ b/docs/admin/templates/managing-templates/devcontainers/add-devcontainer.md @@ -0,0 +1,150 @@ +# Add a dev container template to Coder + +A Coder administrator adds a dev container-compatible template to Coder +(Envbuilder). This allows the template to prompt for the developer for their dev +container repository's URL as a +[parameter](../../extending-templates/parameters.md) when they create their +workspace. Envbuilder clones the repo and builds a container from the +`devcontainer.json` specified in the repo. + +You can create template files through the Coder dashboard, CLI, or you can +choose a template from the +[Coder registry](https://registry.coder.com/templates): + +
+ +## Dashboard + +1. In the Coder dashboard, select **Templates** then **Create Template**. +1. Use a + [starter template](https://github.com/coder/coder/tree/main/examples/templates) + or create a new template: + + - Starter template: + + 1. Select **Choose a starter template**. + 1. Choose a template from the list or select **Devcontainer** from the + sidebar to display only dev container-compatible templates. + 1. Select **Use template**, enter the details, then select **Create + template**. + + - To create a new template, select **From scratch** and enter the templates + details, then select **Create template**. + +1. Edit the template files to fit your deployment. + +## CLI + +1. Use the `template init` command to initialize your choice of image: + + ```shell + coder template init --id devcontainer-kubernetes + ``` + + A list of available templates is shown in the + [templates_init](../../../../reference/cli/templates.md) reference. + +1. `cd` into the directory and push the template to your Coder deployment: + + ```shell + cd devcontainer-kubernetes && coder templates push + ``` + + You can also edit the files or make changes to the files before you push them + to Coder. + +## Registry + +1. Go to the [Coder registry](https://registry.coder.com/templates) and select a + dev container-compatible template. + +1. Copy the files to your local device, then edit them to fit your needs. + +1. Upload them to Coder through the CLI or dashboard: + + - CLI: + + ```shell + coder templates push -d + ``` + + - Dashboard: + + 1. Create a `.zip` of the template files: + + - On Mac or Windows, highlight the files and then right click. A + "compress" option is available through the right-click context menu. + + - To zip the files through the command line: + + ```shell + zip templates.zip Dockerfile main.tf + ``` + + 1. Select **Templates**. + 1. Select **Create Template**, then **Upload template**: + + ![Upload template](../../../../images/templates/upload-create-your-first-template.png) + + 1. Drag the `.zip` file into the **Upload template** section and fill out the + details, then select **Create template**. + + ![Upload the template files](../../../../images/templates/upload-create-template-form.png) + +
+ +To set variables such as the namespace, go to the template in your Coder +dashboard and select **Settings** from the **⋮** (vertical ellipsis) menu: + +Choose Settings from the template's menu + +## Envbuilder Terraform provider + +When using the +[Envbuilder Terraform provider](https://registry.terraform.io/providers/coder/envbuilder/latest/docs), +a previously built and cached image can be reused directly, allowing dev +containers to start instantaneously. + +Developers can edit the `devcontainer.json` in their workspace to customize +their development environments: + +```json +# … +{ + "features": { + "ghcr.io/devcontainers/features/common-utils:2": {} + } +} +# … +``` + +## Example templates + +| Template | Description | +| ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [Docker dev containers](https://github.com/coder/coder/tree/main/examples/templates/devcontainer-docker) | Docker provisions a development container. | +| [Kubernetes dev containers](https://github.com/coder/coder/tree/main/examples/templates/devcontainer-kubernetes) | Provisions a development container on the Kubernetes cluster. | +| [Google Compute Engine dev container](https://github.com/coder/coder/tree/main/examples/templates/gcp-devcontainer) | Runs a development container inside a single GCP instance. It also mounts the Docker socket from the VM inside the container to enable Docker inside the workspace. | +| [AWS EC2 dev container](https://github.com/coder/coder/tree/main/examples/templates/aws-devcontainer) | Runs a development container inside a single EC2 instance. It also mounts the Docker socket from the VM inside the container to enable Docker inside the workspace. | + +Your template can prompt the user for a repo URL with +[parameters](../../extending-templates/parameters.md): + +![Dev container parameter screen](../../../../images/templates/devcontainers.png) + +## Dev container lifecycle scripts + +The `onCreateCommand`, `updateContentCommand`, `postCreateCommand`, and +`postStartCommand` lifecycle scripts are run each time the container is started. +This could be used, for example, to fetch or update project dependencies before +a user begins using the workspace. + +Lifecycle scripts are managed by project developers. + +## Next steps + +- [Dev container security and caching](./devcontainer-security-caching.md) + +``` + +``` diff --git a/docs/admin/templates/managing-templates/devcontainers/devcontainer-releases-known-issues.md b/docs/admin/templates/managing-templates/devcontainers/devcontainer-releases-known-issues.md new file mode 100644 index 0000000000..b8ba3bfddd --- /dev/null +++ b/docs/admin/templates/managing-templates/devcontainers/devcontainer-releases-known-issues.md @@ -0,0 +1,25 @@ +# Dev container releases and known issues + +## Release channels + +Envbuilder provides two release channels: + +- **Stable** + - Available at + [`ghcr.io/coder/envbuilder`](https://github.com/coder/envbuilder/pkgs/container/envbuilder). + Tags `>=1.0.0` are considered stable. +- **Preview** + - Available at + [`ghcr.io/coder/envbuilder-preview`](https://github.com/coder/envbuilder/pkgs/container/envbuilder-preview). + Built from the tip of `main`, and should be considered experimental and + prone to breaking changes. + +Refer to the +[Envbuilder GitHub repository](https://github.com/coder/envbuilder/) for more +information and to submit feature requests or bug reports. + +## Known issues + +Visit the +[Envbuilder repository](https://github.com/coder/envbuilder/blob/main/docs/devcontainer-spec-support.md) +for a full list of supported features and known issues. diff --git a/docs/admin/templates/managing-templates/devcontainers/devcontainer-security-caching.md b/docs/admin/templates/managing-templates/devcontainers/devcontainer-security-caching.md new file mode 100644 index 0000000000..bb56ff6a31 --- /dev/null +++ b/docs/admin/templates/managing-templates/devcontainers/devcontainer-security-caching.md @@ -0,0 +1,66 @@ +# Dev container security and caching + +Ensure Envbuilder can only pull pre-approved images and artifacts by configuring +it with your existing HTTP proxies, firewalls, and artifact managers. + +### Configure registry authentication + +You may need to authenticate to your container registry, such as Artifactory, or +Git provider such as GitLab, to use Envbuilder. See the +[Envbuilder documentation](https://github.com/coder/envbuilder/blob/main/docs/container-registry-auth.md) +for more information. + +## Layer and image caching + +To improve build times, dev containers can be cached. There are two main forms +of caching: + +- **Layer caching** + + - Caches individual layers and pushes them to a remote registry. When building + the image, Envbuilder will check the remote registry for pre-existing layers + These will be fetched and extracted to disk instead of building the layers + from scratch. + +- **Image caching** + + - Caches the entire image, skipping the build process completely (except for + post-build + [lifecycle scripts](./add-devcontainer.md#dev-container-lifecycle-scripts)). + +Note that caching requires push access to a registry, and may require approval +from relevant infrastructure team(s). + +Refer to the +[Envbuilder documentation](https://github.com/coder/envbuilder/blob/main/docs/caching.md) +for more information about Envbuilder and caching. + +Visit the +[speed up templates](../../../../tutorials/best-practices/speed-up-templates.md) +best practice documentation for more ways that you can speed up build times. + +### Image caching + +To support resuming from a cached image, use the +[Envbuilder Terraform Provider](https://github.com/coder/terraform-provider-envbuilder) +in your template. The provider will: + +1. Clone the remote Git repository, +1. Perform a "dry-run" build of the dev container in the same manner as + Envbuilder would, +1. Check for the presence of a previously built image in the provided cache + repository, +1. Output the image remote reference in SHA256 form, if it finds one. + +The example templates listed above will use the provider if a remote cache +repository is provided. + +If you are building your own Dev container template, you can consult the +[provider documentation](https://registry.terraform.io/providers/coder/envbuilder/latest/docs/resources/cached_image). +You may also wish to consult a +[documented example usage of the `envbuilder_cached_image` resource](https://github.com/coder/terraform-provider-envbuilder/blob/main/examples/resources/envbuilder_cached_image/envbuilder_cached_image_resource.tf). + +## Next steps + +- [Dev container releases and known issues](./devcontainer-releases-known-issues.md) +- [Dotfiles](../../../../user-guides/workspace-dotfiles.md) diff --git a/docs/admin/templates/managing-templates/devcontainers/index.md b/docs/admin/templates/managing-templates/devcontainers/index.md new file mode 100644 index 0000000000..a4ec140765 --- /dev/null +++ b/docs/admin/templates/managing-templates/devcontainers/index.md @@ -0,0 +1,122 @@ +# Dev containers + +A Development Container is an +[open-source specification](https://containers.dev/implementors/spec/) for +defining containerized development environments which are also called +development containers (dev containers). + +Dev containers provide developers with increased autonomy and control over their +Coder cloud development environments. + +By using dev containers, developers can customize their workspaces with tools +pre-approved by platform teams in registries like +[JFrog Artifactory](../../../integrations/jfrog-artifactory.md). This simplifies +workflows, reduces the need for tickets and approvals, and promotes greater +independence for developers. + +## Prerequisites + +An administrator should construct or choose a base image and create a template +that includes a `devcontainer_builder` image before a developer team configures +dev containers. + +## Benefits of devcontainers + +There are several benefits to adding a dev container-compatible template to +Coder: + +- Reliability through standardization +- Scalability for growing teams +- Improved security +- Performance efficiency +- Cost Optimization + +### Reliability through standardization + +Use dev containers to empower development teams to personalize their own +environments while maintaining consistency and security through an approved and +hardened base image. + +Standardized environments ensure uniform behavior across machines and team +members, eliminating "it works on my machine" issues and creating a stable +foundation for development and testing. Containerized setups reduce dependency +conflicts and misconfigurations, enhancing build stability. + +### Scalability for growing teams + +Dev containers allow organizations to handle multiple projects and teams +efficiently. + +You can leverage platforms like Kubernetes to allocate resources on demand, +optimizing costs and ensuring fair distribution of quotas. Developer teams can +use efficient custom images and independently configure the contents of their +version-controlled dev containers. + +This approach allows organizations to scale seamlessly, reducing the maintenance +burden on the administrators that support diverse projects while allowing +development teams to maintain their own images and onboard new users quickly. + +### Improved security + +Since Coder and Envbuilder run on your own infrastructure, you can use firewalls +and cluster-level policies to ensure Envbuilder only downloads packages from +your secure registry powered by JFrog Artifactory or Sonatype Nexus. +Additionally, Envbuilder can be configured to push the full image back to your +registry for additional security scanning. + +This means that Coder admins can require hardened base images and packages, +while still allowing developer self-service. + +Envbuilder runs inside a small container image but does not require a Docker +daemon in order to build a dev container. This is useful in environments where +you may not have access to a Docker socket for security reasons, but still need +to work with a container. + +### Performance efficiency + +Create a unique image for each project to reduce the dependency size of any +given project. + +Envbuilder has various caching modes to ensure workspaces start as fast as +possible, such as layer caching and even full image caching and fetching via the +[Envbuilder Terraform provider](https://registry.terraform.io/providers/coder/envbuilder/latest/docs). + +### Cost optimization + +By creating unique images per-project, you remove unnecessary dependencies and +reduce the workspace size and resource consumption of any given project. Full +image caching ensures optimal start and stop times. + +## When to use a dev container + +Dev containers are a good fit for developer teams who are familiar with Docker +and are already using containerized development environments. If you have a +large number of projects with different toolchains, dependencies, or that depend +on a particular Linux distribution, dev containers make it easier to quickly +switch between projects. + +They may also be a great fit for more restricted environments where you may not +have access to a Docker daemon since it doesn't need one to work. + +## Devcontainer Features + +[Dev container Features](https://containers.dev/implementors/features/) allow +owners of a project to specify self-contained units of code and runtime +configuration that can be composed together on top of an existing base image. +This is a good place to install project-specific tools, such as +language-specific runtimes and compilers. + +## Coder Envbuilder + +[Envbuilder](https://github.com/coder/envbuilder/) is an open-source project +maintained by Coder that runs dev containers via Coder templates and your +underlying infrastructure. Envbuilder can run on Docker or Kubernetes. + +It is independently packaged and versioned from the centralized Coder +open-source project. This means that Envbuilder can be used with Coder, but it +is not required. It also means that dev container builds can scale independently +of the Coder control plane and even run within a CI/CD pipeline. + +## Next steps + +- [Add a dev container template](./add-devcontainer.md) diff --git a/docs/admin/templates/managing-templates/image-management.md b/docs/admin/templates/managing-templates/image-management.md index e1536be3f0..2f4cf2e43e 100644 --- a/docs/admin/templates/managing-templates/image-management.md +++ b/docs/admin/templates/managing-templates/image-management.md @@ -13,7 +13,7 @@ practices around managing workspaces images for Coder. > Note: An image is just one of the many properties defined within the template. > Templates can pull images from a public image registry (e.g. Docker Hub) or an -> internal one., thanks to Terraform. +> internal one, thanks to Terraform. ## Create a minimal base image @@ -70,4 +70,4 @@ specific tooling for their projects. The [Dev Container](https://containers.dev) specification allows developers to define their projects dependencies within a `devcontainer.json` in their Git repository. -- [Learn how to integrate Dev Containers with Coder](./devcontainers.md) +- [Learn how to integrate Dev Containers with Coder](./devcontainers/index.md) diff --git a/docs/admin/templates/managing-templates/index.md b/docs/admin/templates/managing-templates/index.md index 0abbac6048..a9e215bb71 100644 --- a/docs/admin/templates/managing-templates/index.md +++ b/docs/admin/templates/managing-templates/index.md @@ -91,5 +91,5 @@ coder templates delete ## Next steps - [Image management](./image-management.md) -- [Devcontainer templates](./devcontainers.md) +- [Devcontainer templates](./devcontainers/index.md) - [Change management](./change-management.md) diff --git a/docs/images/templates/template-menu-settings.png b/docs/images/templates/template-menu-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..cac2aca1462c07a6c569e791b59030fea9061ca5 GIT binary patch literal 14884 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