### Build and test Moby on Windows

This page explains how to get the software you need to build, test, and run the
Moby source code for Windows and setup the required software and services:

- Windows containers
- GitHub account
- Git

## Prerequisites

### 1. Windows Server 2016 or Windows 10 with all Windows updates applied

The major build number must be at least 14393. This can be confirmed, for example,
by running the following from an elevated PowerShell prompt - this sample output
is from a fully up to date machine as at mid-November 2016:


    PS C:\> $(gin).WindowsBuildLabEx
    14393.447.amd64fre.rs1_release_inmarket.161102-0100

### 2. Git for Windows (or another git client) must be installed

https://git-scm.com/download/win.

### 3. The machine must be configured to run containers

For example, by following the quick start guidance at
https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/quick_start or https://github.com/docker/labs/blob/master/windows/windows-containers/README.md

### 4. If building in a Hyper-V VM

For Windows Server 2016 using Windows Server containers as the default option,
it is recommended you have at least 1GB of memory assigned;
For Windows 10 where Hyper-V Containers are employed, you should have at least
4GB of memory assigned.
Note also, to run Hyper-V containers in a VM, it is necessary to configure the VM
for nested virtualization.

## Usage

The following steps should be run from an elevated Windows PowerShell prompt.

>**Note**:  In a default installation of containers on Windows following the quick-start guidance at https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/quick_start,
the `docker.exe` client must run elevated to be able to connect to the daemon).

### 1. Windows containers

To test and run the Windows Moby engine, you need a system that supports Windows Containers:

- Windows 10 Anniversary Edition
- Windows Server 2016 running in a VM, on bare metal or in the cloud

Check out the [getting started documentation](https://github.com/docker/labs/blob/master/windows/windows-containers/README.md) for details.

### 2. GitHub account

To contribute to the Docker project, you need a <a href="https://github.com" target="_blank">GitHub account</a>.
A free account is fine. All the Moby project repositories are public and visible to everyone.

This guide assumes that you have basic familiarity with Git and Github terminology
and usage.
Refer to [GitHub For Beginners: Don’t Get Scared, Get Started](http://readwrite.com/2013/09/30/understanding-github-a-journey-for-beginners-part-1/)
to get up to speed on Github.

### 3. Git

In PowerShell, run:

    Invoke-Webrequest "https://github.com/git-for-windows/git/releases/download/v2.7.2.windows.1/Git-2.7.2-64-bit.exe" -OutFile git.exe -UseBasicParsing
    Start-Process git.exe -ArgumentList '/VERYSILENT /SUPPRESSMSGBOXES /CLOSEAPPLICATIONS /DIR=c:\git\' -Wait
    setx /M PATH "$env:Path;c:\git\cmd"

You are now ready clone and build the Moby source code.

### 4. Clone Moby

In a new (to pick up the path change) PowerShell prompt, run:

    git clone https://github.com/moby/moby
    cd moby

This clones the main Moby repository. Check out [Moby Project](https://mobyproject.org)
to learn about the other software that powers the Moby platform.

### 5. Build and run

Create a builder-container with the Moby source code. You can change the source
code on your system and rebuild any time:

    docker build -t nativebuildimage -f .\Dockerfile.windows .
    docker build -t nativebuildimage -f Dockerfile.windows -m 2GB .  # (if using Hyper-V containers)

To build Moby, run:

    $DOCKER_GITCOMMIT=(git rev-parse --short HEAD)
    docker run --name binaries -e DOCKER_GITCOMMIT=$DOCKER_GITCOMMIT nativebuildimage hack\make.ps1 -Binary
    docker run --name binaries -e DOCKER_GITCOMMIT=$DOCKER_GITCOMMIT -m 2GB nativebuildimage hack\make.ps1 -Binary  # (if using Hyper-V containers)

Copy out the resulting Windows Moby Engine binary to `dockerd.exe` in the
current directory:

    docker cp binaries:C:\gopath\src\github.com\docker\docker\bundles\docker.exe docker.exe
    docker cp binaries:C:\gopath\src\github.com\docker\docker\bundles\dockerd.exe dockerd.exe

To test it, stop the system Docker daemon and start the one you just built:

    Stop-Service Docker
    .\dockerd.exe -D

The other make targets work too, to run unit tests try:
`docker run --rm docker-builder sh -c 'cd /c/gopath/src/github.com/docker/docker; hack/make.sh test-unit'`.

### 6. Remove the interim binaries container

_(Optional)_

    docker rm binaries

### 7. Remove the image

_(Optional)_

It may be useful to keep this image around if you need to build multiple times.
Then you can take advantage of the builder cache to have an image which has all
the components required to build the binaries already installed.

    docker rmi nativebuildimage

## Validation

The validation tests can only run directly on the host.
This is because they calculate information from the git repo, but the .git directory
is not passed into the image as it is excluded via `.dockerignore`.
Run the following from a Windows PowerShell prompt (elevation is not required):
(Note Go must be installed to run these tests)

    hack\make.ps1 -DCO -PkgImports -GoFormat

## Unit tests

To run unit tests, ensure you have created the nativebuildimage above.
Then run one of the following from an (elevated) Windows PowerShell prompt:

    docker run --rm nativebuildimage hack\make.ps1 -TestUnit
    docker run --rm -m 2GB nativebuildimage hack\make.ps1 -TestUnit  # (if using Hyper-V containers)

To run unit tests and binary build, ensure you have created the nativebuildimage above.
Then run one of the following from an (elevated) Windows PowerShell prompt:

    docker run nativebuildimage hack\make.ps1 -All
    docker run -m 2GB nativebuildimage hack\make.ps1 -All  # (if using Hyper-V containers)

## Windows limitations

Don't attempt to use a bind mount to pass a local directory as the bundles
target directory.
It does not work (golang attempts for follow a mapped folder incorrectly).
Instead, use docker cp as per the example.

`go.zip` is not removed from the image as it is used by the Windows CI servers
to ensure the host and image are running consistent versions of go.

Nanoserver support is a work in progress. Although the image will build if the
`FROM` statement is updated, it will not work when running autogen through `hack\make.ps1`.
It is suspected that the required GCC utilities (eg gcc, windres, windmc) silently
quit due to the use of console hooks which are not available.

The docker integration tests do not currently run in a container on Windows,
predominantly due to Windows not supporting privileged mode, so anything using a volume would fail.
They (along with the rest of the docker CI suite) can be run using
https://github.com/kevpar/docker-w2wCIScripts/blob/master/runCI/Invoke-DockerCI.ps1.

## Where to go next

In the next section, you'll [configure the project to be properly recognized by the IDE](set-up-ide.md).

If you don't want to use IDE, you can proceed to the next step
and [learn how to set up and configure Git for contributing to Moby](set-up-git.md).
