From: Chris Fernald <chrisf...@gmail.com>

Covers:
- Container background
- Docker background and installation
- Local development with containers
- How to manually configure a container
- Integration with VS Code
- Containers in pipelines

Cc: Sean Brogan <sean.bro...@microsoft.com>
Cc: Michael D Kinney <michael.d.kin...@intel.com>
Cc: Liming Gao <gaolim...@byosoft.com.cn>
Cc: Michael Kubacki <michael.kuba...@microsoft.com>
Signed-off-by: Chris Fernald <chfer...@microsoft.com>
---
 How-to-Develop-With-Containers.md | 120 ++++++++++++++++++++
 1 file changed, 120 insertions(+)

diff --git a/How-to-Develop-With-Containers.md 
b/How-to-Develop-With-Containers.md
new file mode 100644
index 000000000000..509ceb981dfb
--- /dev/null
+++ b/How-to-Develop-With-Containers.md
@@ -0,0 +1,120 @@
+# How to Develop With Containers
+
+Because various EDKII project can have specific build tools and environment 
requirements
+it can be beneficial to use a container build environment for local 
development.
+TianoCore maintains container images for various Operating Systems and tool 
chains in the
+[TianoCore Containers repository](https://github.com/tianocore/containers). 
These
+images contain the build tools and environment configurations to ensure a 
consistent
+and reproducible build between local development, CI, and pipeline platform 
builds.
+
+If you are new to the concept of containers, more information can be found
+[on the Docker website](https://www.docker.com/resources/what-container/).
+
+## Setting up Docker
+
+> NOTE:
+> Some Docker software is not free and some uses of Docker may require a 
personal or
+> Business subscription. Users should verify their use is licensed for their 
organization
+> if necessary.
+
+The existing TianoCore container images are created for use with Docker. On 
Linux,
+docker can be installed through the distributions package management 
application.
+For specific builds and for other operating systems, see the [Docker install 
page](https://docs.docker.com/engine/install/).
+
+### Windows Docker Setup
+
+It is strongly recommended to use the WSL 2 based engine when running Docker on
+Windows. This can be configured in the General settings in Docker Desktop. 
Generally,
+this provides better performance and overall design over the legacy. Details on
+this framework can be found in the [Docker 
documentation](https://docs.docker.com/desktop/windows/wsl/).
+
+## Local Development
+
+To use the build container images to develop locally, there are several 
configurations
+depending the developers preferences. This section details some tools and tips 
that
+make using containers for local development easier. This section is not 
comprehensive
+however and it is encouraged users experiment and consider contributing back 
any
+new useful configurations or tools to this documentation.
+
+> NOTE:
+> If the code base is cloned in Windows, it is not advised to directly open
+> this repository in a Linux dev container as the file system share between 
Windows
+> and WSL 2 causes a very significant performance reduction. Instead, clone the
+> repo in the WSL file system and map into the container or directly clone into
+> the container.
+
+### Manually configuring the container
+
+Some developers may wish to manually maintain their containers. This is useful
+for using editors that do not have native support for containers or the 
specific
+type of containers used.
+
+First, select the image most appropriate from the [TianoCore containers 
list](https://github.com/tianocore/containers#current-status)
+or a custom image for a specific platform or project. This image can be pulled 
down
+from the docker command line.
+
+```bash
+docker pull ghcr.io/tianocore/containers/<image>:<tag>
+```
+
+After pulling the image, the image can be started. It is useful to map in the 
workspace
+from the host OS as this allows easy access to the code and build files from 
the
+host as well as the container.
+
+```bash
+docker run -i -v <local-code-directory>:<container-directory> 
--workdir=<container directory> --name=<name> 
ghcr.io/tianocore/containers/<image>:<tag>
+```
+
+After the container is existed, it can be resume by using the start command.
+
+```bash
+docker start -i <name>
+```
+
+When running in the container, the build instructions should be used as they 
normally
+would using the stuart commands.
+
+### Visual Studio Code
+
+The Visual Studio Code [Dev Container 
extension](https://code.visualstudio.com/docs/devcontainers/containers)
+provides an easy and consistent way to use containers for local development. At
+the time of writing, this extension only supports Linux based containers. This
+extension provides a number of useful additions to the specified docker image 
on
+creation.
+
+- Configures git credential manager to pipe in git credentials.
+- Makes extensions available on code inside the container.
+- Abstracts management of the container for seamless use in the editor.
+
+For a shared docker image configuration, this can be configured by creating a
+.devcontainer file in the repository. Some useful configurations are details 
below.
+
+| Configuration          | Purpose |
+| :------------          | :------ |
+| "privileged": true     | This may be needed for access to KVM for QEMU 
acceleration.  |
+| "forwardPorts": [####] | Can be used to forward debug or serial ports to the 
host OS. |
+
+It may also be desireable to run initialization commands using the 
"postCreateCommand"
+option. Specifically running `git config --global --add safe.directory 
${containerWorkspaceFolder}`
+may be required if mapping the repository into the container is expected.
+
+And example of a devcontainer used for a QEMU platform repo is included below.
+
+```json
+{
+  "image": "ghcr.io/tianocore/containers/fedora-35-dev:latest",
+  "postCreateCommand": "git config --global --add safe.directory 
${containerWorkspaceFolder} && pip install --upgrade -r pip-requirements.txt",
+  "forwardPorts": [5000],
+  "privileged": true
+}
+```
+
+## Pipeline Builds
+
+Both Azure pipelines and github workflows have native support for containers. 
Information
+on this can be found in the [Azure Pipeline 
Documentation](https://learn.microsoft.com/en-us/azure/devops/pipelines/process/container-phases?view=azure-devops)
+and the [Github Workflow 
Documentation](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions).
+
+One important detail to note is that Azure pipelines will create a new user in 
the
+docker image during the pipeline. This user is used for all tasks and 
operations
+and so certain local user install locations may not be by default on the path.
-- 
2.28.0.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#96964): https://edk2.groups.io/g/devel/message/96964
Mute This Topic: https://groups.io/mt/95472138/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to