如何使用附加功能在docker容器中运行脚本(docker exec…--cap add…)

如何使用附加功能在docker容器中运行脚本(docker exec…--cap add…),docker,docker-run,docker-exec,Docker,Docker Run,Docker Exec,如何在docker容器中使用附加功能(如NET\u ADMIN)运行脚本 我正在测试一些我想在docker映像中运行的命令,这些命令需要NET\u ADMIN权限。例如,这项工作: docker run --rm -it --cap-add 'NET_ADMIN' debian:stable-slim "iptables -L" 但是如果我想执行一个脚本(通过docker exec),那么--cap add选项突然不可用 root@disp8686:~# cat <&

如何在docker容器中使用附加功能(如
NET\u ADMIN
)运行脚本

我正在测试一些我想在docker映像中运行的命令,这些命令需要
NET\u ADMIN
权限。例如,这项工作:

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:~# 
root@disp8686:~#cat docker_script.sh
>apt获取更新
>apt get-y安装iptables
>iptables-L
>EOF
root@disp8686:~#docker exec-it--cap添加'NET_ADMIN'debian:stable slim docker_script.sh
未知标志:-cap add
请参阅“docker exec--帮助”。
root@disp8686:~# 

为什么
--cap add
存在于
docker run
而不是
docker exec
,我如何使用
--cap add
在docker容器中运行脚本?

docker exec
不支持
--cap add
选项,但您可以使用
docker run
--volume
选项使docker主机上的脚本可用于容器,并在容器内执行,如下所示:

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"
tmpDir=`mktemp-d`
pushd“${tmpDir}”
cat docker_script.sh
更新源
apt get-y安装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”
以下是Debian 10中的执行示例:

user@disp7086:~$ tmpDir=`mktemp -d`
user@disp7086:~$ pushd "${tmpDir}"
/tmp/tmp.PXmB9uJ8oM ~
user@disp7086:/tmp/tmp.PXmB9uJ8oM$ 
user@disp7086:/tmp/tmp.PXmB9uJ8oM$ cat << EOF > docker_script.sh
> apt-get update
> apt-get -y install iptables
> iptables -L
> EOF
user@disp7086:/tmp/tmp.PXmB9uJ8oM$ chmod +x docker_script.sh
user@disp7086:/tmp/tmp.PXmB9uJ8oM$ 

user@disp7086:/tmp/tmp.PXmB9uJ8oM$ sudo docker run --rm -it --cap-add 'NET_ADMIN' --volume "${tmpDir}:/root" debian:stable-slim /bin/bash -c "cd /root && ./docker_script.sh"
Get:1 http://deb.debian.org/debian stable InRelease [122 kB]
...
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
user@disp7086:/tmp/tmp.PXmB9uJ8oM$

user@disp7086:~$tmpDir=`mktemp-d`
user@disp7086:~$pushd“${tmpDir}”
/tmp/tmp.PXmB9uJ8oM~
user@disp7086:/tmp/tmp.PXmB9uJ8oM$
user@disp7086:/tmp/tmp.PXmB9uJ8oM$cat docker\u script.sh
>apt获取更新
>apt get-y安装iptables
>iptables-L
>EOF
user@disp7086:/tmp/tmp.PXmB9uJ8oM$chmod+x docker\u script.sh
user@disp7086:/tmp/tmp.PXmB9uJ8oM$
user@disp7086:/tmp/tmp.PXmB9uJ8oM$sudo docker run--rm-it--cap add'NET_ADMIN'--volume“${tmpDir}:/root”debian:stable slim/bin/bash-c“cd/root&./docker_script.sh”
获得:1http://deb.debian.org/debian 稳定内切酶[122 kB]
...
链输入(策略接受)
目标保护选项源目标
前向链(保单接受)
目标保护选项源目标
链输出(策略接受)
目标保护选项源目标
user@disp7086:/tmp/tmp.PXmB9uJ8oM$

docker exec
是一个调试工具,无法更改容器的功能集。作为设计目标,容器通常不能修改主机的网络配置;不管你想跑什么,最好不用Docker。是否有实际需要此设置的相关应用程序代码可以添加到问题中?目的不是修改主机的网络配置。目的是修改容器的网络配置。这是我的应用程序的构建脚本,我需要
NET\u ADMIN
来配置
iptables
,这样我就可以确保一些可能下载未经验证代码(即
pip
)的构建命令不能访问互联网,而安全包管理器(例如
apt get
)可以访问互联网。我使用docker,因此它是可移植的,用户可以轻松验证我的构建是可复制的。