如何在具有附加功能的Docker容器中运行脚本docker exec ... --cap-add ...

问题描述

如何在具有附加功能(例如NET_ADMIN)的docker容器中运行脚本?

我正在测试一些我想在具有NET_ADMIN权限的docker映像中运行的命令。例如,这有效:

docker run --rm -it --cap-add 'NET_ADMIN' debian:stable-slim "iptables -L"

但是,如果我想执行脚本(通过docker exec),则突然--cap-add选项不可用。

root@disp8686:~# cat << EOF > docker_script.sh
> apt-get update
> apt-get -y install iptables
> iptables -L
> EOF
root@disp8686:~# docker exec -it --cap-add 'NET_ADMIN' debian:stable-slim docker_script.sh
unkNown flag: --cap-add
See 'docker exec --help'.
root@disp8686:~# 

为什么--cap-add存在docker run却不存在docker exec,为什么我要使用--cap-add在docker容器中运行脚本?

解决方法

docker exec不支持--cap-add选项,但是您可以使用--volume的{​​{1}}选项使Docker主机上的脚本可用于容器并执行如下所示:

docker run

这是Debian 10中的示例执行:

tmpDir=`mktemp -d`
pushd "${tmpDir}"

cat << EOF > docker_script.sh
apt-get update
apt-get -y install iptables
iptables -L
EOF
chmod +x docker_script.sh

sudo docker run --rm -it --cap-add 'NET_ADMIN' --volume "${tmpDir}:/root" debian:stable-slim /bin/bash -c "cd /root && ./docker_script.sh"

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...