| ### Debugging the daemon |
| |
| The Docker daemon inside the development container can be debugged with [Delve](https://github.com/go-delve/delve). |
| |
| Delve debugger listens on a port, which has to be exposed outside the development container. |
| Also, in order to be able to debug the daemon, it has to be compiled with the debugging symbols. |
| This can be done by launching the development container with the following command: |
| |
| ```bash |
| $ make BIND_DIR=. DOCKER_DEBUG=1 DELVE_PORT=127.0.0.1:2345:2345 shell |
| ``` |
| |
| The `DOCKER_DEBUG` variable disables build optimizations, allowing to debug the binary, |
| while `DELVE_PORT` publishes the specified port for use with the debugger. |
| |
| The `DELVE_PORT` variable accepts the port in the same format as Docker CLI's `--publish` (`-p`) option. |
| This means that the port can be published in multiple ways: |
| |
| 1. `DELVE_PORT=127.0.0.1:2345:2345` - exposes debugger on port `2345` for local development only (recommended) |
| 2. `DELVE_PORT=2345:2345` - exposes debugger on port `2345` without binding to specific IP |
| 3. `DELVE_PORT=2345` - same as above |
| |
| **IMPORTANT:** Publishing the port without binding it to localhost (127.0.0.1) might expose the debugger |
| outside the developer's machine and is not recommended. |
| |
| ## Running Docker daemon with debugger attached |
| |
| 1. Run development container with build optimizations disabled (ie. `DOCKER_DEBUG=1`) and Delve enabled: |
| ```bash |
| $ make BIND_DIR=. DOCKER_DEBUG=1 DELVE_PORT=127.0.0.1:2345:2345 shell |
| ``` |
| 2. Inside the development container: |
| 1. Build the Docker daemon: |
| ```bash |
| $ ./hack/make.sh binary |
| ``` |
| 2. Install the newly-built daemon: |
| ```bash |
| $ make install |
| ``` |
| 3. Run the daemon through the `make.sh` script: |
| ```bash |
| $ ./hack/make.sh run |
| ``` |
| The execution will stop and wait for the IDE or Delve CLI to attach |
| to the port, specified with the `DELVE_PORT` variable. |
| Once the IDE or Delve CLI is attached, the execution will continue. |
| |
| ## Running integration tests with debugger attached |
| |
| 1. Run development container with build optimizations disabled (ie. `DOCKER_DEBUG=1`) and Delve enabled: |
| |
| ```bash |
| $ make BIND_DIR=. DOCKER_DEBUG=1 DELVE_PORT=127.0.0.1:2345:2345 shell |
| ``` |
| |
| 2. Inside the development container, run the integration test you want through the `make.sh` script: |
| |
| ```bash |
| $ TEST_INTEGRATION_DIR=./integration/networking \ |
| TESTFLAGS='-test.run TestBridgeICC' \ |
| ./hack/make.sh dynbinary test-integration |
| ``` |
| |
| The execution will pause and wait for the IDE or Delve CLI to attach |
| to the port, specified with the `DELVE_PORT` variable. |
| Once the IDE or Delve CLI is attached, the test execution will start. |
| |
| ## Debugging from IDE (on example of GoLand 2021.3) |
| |
| 1. Open the project in GoLand |
| 2. Click *Add Configuration* on the taskbar |
|  |
| 3. Create the *Go Remote* configuration. |
| No changes are necessary, unless a different port is to be used. |
|  |
| 4. Run the Docker binary in the development container, as described in the previous section. |
| Make sure that the port in the `DELVE_PORT` variable corresponds to one, used in the *Go Remote* configuration. |
| 5. Run the *Go Remote* configuration. |
| The Docker daemon will continue execution inside the container and debugger will stop it on the breakpoints. |
|  |
| |
| ## Where to go next |
| |
| Congratulations, you have experienced how to use Delve to debug the Docker daemon |
| and how to configure an IDE to make use of it. |