&引用;RTNETLINK回答:不允许操作“;在docker构建期间`

&引用;RTNETLINK回答:不允许操作“;在docker构建期间`,docker,network-programming,Docker,Network Programming,我想使用tc和netem在一些本地主机端口上构建一个延迟+丢失的Docker映像 tc命令适用于常规vm,但不适用于Dockerfile 这是我的Dockerfile: FROM ubuntu:16.04 RUN DEBIAN_FRONTEND="noninteractive" \ apt-get update --fix-missing && \ apt-get -y install \ apt-utils \ softwa

我想使用
tc
netem
在一些本地主机端口上构建一个延迟+丢失的Docker映像
tc
命令适用于常规vm,但不适用于Dockerfile

这是我的Dockerfile:

FROM ubuntu:16.04

RUN DEBIAN_FRONTEND="noninteractive" \
    apt-get update --fix-missing && \
    apt-get -y install \
    apt-utils \
    software-properties-common \
    iproute2

RUN tc qdisc add dev lo root handle 1: htb
我尝试使用以下命令构建它:

docker build .
但在运行命令时失败,出现以下错误:

Step 3/3 : RUN tc qdisc add dev lo root handle 1: htb
 ---> Running in 59b27236040b
RTNETLINK answers: Operation not permitted

我找到了,但我的问题发生在
docker构建期间,而不是
docker运行期间。我无法指定
--cap add
,因为这不是
docker build

的选项。正如其中一条评论所说,在构建阶段运行
tc
命令没有意义

我使用的解决方法是:

  • 为容器中的
    tc
    添加权限(如果最终容器用户不是root),但不要实际运行Dockerfile中的任何
    tc
    命令
  • 按正常方式构建容器
  • 运行容器,添加
    --cap add=NET\u ADMIN
  • 从运行的容器内部,执行
    tc
    命令

  • 这个操作真的没有意义。Docker没有完全虚拟化的网络,容器通常无法在这种细节级别控制其网络环境;另外,映像只是一个文件系统加上一些描述如何启动容器的元数据,像这样的运行时设置不会持久保存在映像中。我会坚持使用虚拟机。我还是Docker的新手,所以我误解了它的功能是有道理的。但是netem在运行时位于容器中,我想将此配置应用于从映像派生的所有容器,因此对我来说,指定这些设置的逻辑位置是Dockerfile。听起来我需要在运行时做些什么,谢谢你的评论。