我试图阻止我的 docker 容器(运行 ubuntu 22.04)回复 ping。目前,我正在尝试这两种方法:
sysctl -w net.ipv4.icmp_echo_ignore_all=1
。我只能从容器内部运行此命令,并且只有包含 --privileged 参数才能使其工作:docker run -it --privileged --name container_name image_name
。这完成了工作,但更改不是持久的,这意味着如果我使用 docker commit running_container_name image_to_be_created_name
将更改保存到另一个图像并使用 docker run 再次启动该图像,icmp_echo_ignore_all 的值将是 0。net.ipv4.icmp_echo_ignore_all = 1
添加到 /etc/sysctl.conf
文件,然后运行 sysctl -p
,我收到此错误:“sysctl:无法 stat /proc/sys/net/ipv4/icmp_echo_ignore_all :没有这样的文件或目录”。
当我尝试将 icmp_echo_ignore_all 的值(与错误所述相反)更改为 1 时,手动或通过运行 echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
,我收到此错误:“bash:/proc/sys/net/ipv4/icmp_echo_ignore_all:只读文件系统”我在 Dockerfile 中添加了 no.1 的命令,但没有效果。
是否有其他方法可以禁用 ping,并且最好使更改保持持久?我可以将任何命令添加到 Dockerfile 来执行此操作吗?
如果有帮助,我正在使用 Fargate 启动类型在 AWS ECS 中运行此容器。
您所描述的各种更改是内核设置;没有办法让它们在容器镜像中“持久化”。运行
docker commit ...
无效,因为更改 sysctl
设置不会更改磁盘上的任何文件; Docker 无需保存任何内容(一般来说,您不应该使用 docker commit
;您希望使用 Dockerfile 来构建映像,以便拥有可管理、可重复的流程)。
另一方面,只要您可以确保容器以适当的权限运行(例如,
docker run --privileged
),您就可以进行配置,以便在容器启动时自动应用命令。
ENTRYPOINT
脚本;该脚本在启动时运行并接收 CMD
的值作为其参数。如果您有一个如下所示的 ENTRYPOINT 脚本:
#!/bin/sh
sysctl -w net.ipv4.icmp_echo_ignore_all=1
exec "$@"
在你的 Dockerfile 中:
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["my-application"]
然后,每当您启动容器 (
docker run --privileged mycontainer
) 时,它都会在运行应用程序之前运行 sysctl
命令。
在这里回答我自己的问题:
要对使用 Fargate 启动类型运行的容器禁用 ping,请在创建任务定义时选择 使用 JSON 创建任务定义并将其包含在任务定义 json 中:
"systemControls": [
{
"namespace": "net.ipv4.icmp_echo_ignore_all",
"value": "1"
}]