在 ubuntu docker 容器中禁用 ping

问题描述 投票:0回答:2

我试图阻止我的 docker 容器(运行 ubuntu 22.04)回复 ping。目前,我正在尝试这两种方法:

  1. 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
  2. 将此行
    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 ubuntu dockerfile ubuntu-22.04 icmp
2个回答
1
投票

您所描述的各种更改是内核设置;没有办法让它们在容器镜像中“持久化”。运行

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
命令。


0
投票

在这里回答我自己的问题:

要对使用 Fargate 启动类型运行的容器禁用 ping,请在创建任务定义时选择 使用 JSON 创建任务定义并将其包含在任务定义 json 中:

"systemControls": [
                {
                    "namespace": "net.ipv4.icmp_echo_ignore_all",
                    "value": "1"
                }]
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.