【问题标题】:How to run script in docker container with additional capabilities (docker exec ... --cap-add ...)如何在具有附加功能的 docker 容器中运行脚本(docker exec ... --cap-add ...)
【发布时间】:2020-09-18 16:50:37
【问题描述】:

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

我正在测试一些我想在需要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:~# 

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

【问题讨论】:

  • docker exec 是调试工具,不能更改容器的能力集。作为设计目标,容器一般不能修改主机的网络配置;无论您尝试运行什么,最好不要使用 Docker。是否有实际需要此设置的相关应用程序代码可以添加到问题中?
  • 目的不是修改主机的网络配置。目的是修改容器的网络配置。这是我的应用程序的构建脚本,我需要NET_ADMIN 来配置iptables,所以我可以确定一些可能会下载未经验证的代码(即pip)的构建命令在安全的情况下无法访问互联网包管理器(例如apt-get)可以。我正在使用 docker,因此它是可移植的,用户可以轻松验证我的构建是否可重现。

标签: docker docker-run docker-exec


【解决方案1】:

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"

这是一个在 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$

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 2017-12-03
    • 2022-01-14
    相关资源
    最近更新 更多