Add support for userns in ecs-agent and TaskDefinition
- Dominant language
- Shell
- Stars
- 5.4k
- Forks
- 334
- PR merge metrics
- No merged PRs in 30d
Description
### Summary
we wish to enable UserNS remap support in our docker setup using ECS for security. The datadog agent container requires '--userns=host' when running in that mode, which is currently not supported by TaskDefinition
### Description
UserNS remap is documented in https://success.docker.com/article/introduction-to-user-namespaces-in-docker-engine
activation of the mode is easy and it generally works. But if the ECS service (like datadog agent) requires --pid=host (to monitor all processes on the EC2 instance), when using userns-remap, the container must also run with --userns=host otherwise, Docker will fail to start the container with the following error:
```
level=error msg="Handler for POST /v1.21/containers/create?name=ecs-ecs-int-datadog-agent-70-datadogagent-94c1bb86b1898abfdd01 returned error: cannot share the host's network namespace when user namespaces are enabled"
```
docker run supports the flag as per https://docs.docker.com/engine/reference/commandline/run/
it was mentioned in aws/amazon-ecs-agent#502 but never implemented (probably due to a lack of requests).
### Environment Details
* docker 19.06.3
* ecs-agent 1.37.0
* Kernel 4.19.104-linuxkit
* EC2 (t3.xlarge)
### Supporting Log Snippets
Docker logs issues with datadog agent:
```
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.369910602Z" level=info msg="Starting up"
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.370051577Z" level=info msg="User namespaces: ID ranges will be mapped to subuid/subgid ranges of: dockremap:dockremap"
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.372721442Z" level=warning msg="could not change group /var/run/docker.sock to docker: group docker not found"
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.373519096Z" level=info msg="User namespaces: ID ranges will be mapped to subuid/subgid ranges of: dockremap:dockremap"
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.376523753Z" level=info msg="parsed scheme: \"unix\"" module=grpc
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.376538082Z" level=info msg="scheme \"unix\" not registered, fallback to default scheme" module=grpc
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.376554880Z" level=info msg="ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock 0 }] }" module=grpc
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.376562869Z" level=info msg="ClientConn switching balancer to \"pick_first\"" module=grpc
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.377827080Z" level=info msg="parsed scheme: \"unix\"" module=grpc
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.377843346Z" level=info msg="scheme \"unix\" not registered, fallback to default scheme" module=grpc
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.377857174Z" level=info msg="ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock 0 }] }" module=grpc
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.377871244Z" level=info msg="ClientConn switching balancer to \"pick_first\"" module=grpc
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.407009277Z" level=info msg="Loading containers: start."
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.502508969Z" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address"
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.543803565Z" level=info msg="Loading containers: done."
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.562232469Z" level=info msg="Docker daemon" commit=369ce74a3c graphdriver(s)=overlay2 version=19.03.6
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.566166969Z" level=info msg="Daemon has completed initialization"
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.617651310Z" level=info msg="API listen on /var/run/docker.sock"
2020-02-26T21:19:19Z 030_docker time="2020-02-26T21:19:19.620968921Z" level=error msg="Handler for POST /v1.21/containers/create?name=ecs-ecs-int-datadog-agent-70-datadogagent-94d889ac99de97ffc701 returned error: cannot share the host's network namespace when user namespaces are enabled"
2020-02-26T21:20:03Z 030_docker time="2020-02-26T21:20:03.136315849Z" level=error msg="Handler for POST /v1.21/containers/create?name=ecs-ecs-int-datadog-agent-70-datadogagent-94f5c09fdca3e5c0f501 returned error: cannot share the host's network namespace when user namespaces are enabled"
2020-02-26T21:20:42Z 030_docker time="2020-02-26T21:20:42.967553698Z" level=error msg="Handler for POST /v1.21/containers/create?name=ecs-ecs-int-datadog-agent-70-datadogagent-94f1ac98a89395cf3000 returned error: cannot share the host's network namespace when user namespaces are enabled"
```
Contributor guide
Research direction
The requested surface is ecs-agent and TaskDefinition; begin by tracing how TaskDefinition options become Docker container settings. Completion means a task can express --userns=host and the resulting container starts successfully with the host namespace configuration described in the issue.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- docker
- Domain
- backend, cloud
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100