ECS容器可以访问docker socket吗?

wi3ka0sx  于 2023-06-21  发布在  Docker
关注(0)|答案(3)|浏览(115)

我有一个docker镜像,其唯一的目的是启动子docker镜像以进行持续集成。
如果我在任何支持docker的计算机上运行它,它将是:

docker run -d \
   -e DRONE_SERVER=wss://ci.fommil.com/ws/broker \
   -e DRONE_SECRET=... \
   -e DOCKER_MAX_PROCS=1 \
   -e DRONE_TIMEOUT=30m \
   -v /var/run/docker.sock:/var/run/docker.sock \
   --restart=always \
   --name=drone-agent \
   drone/drone:0.5 agent

但ECS面板似乎不允许我通过v标志。我不认为这是通过,即使我选择特权模式。
此映像只包含一个二进制文件。这是不可能的ssh和戳周围。如何使用ECS工具对此进行调试?例如,查看Docker启动参数。
我怎样才能安装插座呢?我是否必须退回到管理我自己的EC2示例来启动docker?

bfhwhh0e

bfhwhh0e1#

我把它修好了!
诀窍是在任务级别(-v左手)添加一个卷,然后在容器级别将其添加为挂载,选择放置位置(-v的右侧)。

mutmk8jj

mutmk8jj2#

fommil已经发布了解决方案。可能还需要在运行的容器中更改对docker.sock的访问权限。原因:在挂载docker.socks后,所有者被设置为root,只要你的实际用户不是root,他就不能访问它--这应该是真的。

不要只是尝试从你的docker容器中chown $USER_NAME。/var/run/docker.sock

这也会改变源代码的权限,你将无法从ec2-user帐户访问它!
您需要您的用户是正确组的成员,或者使用以下快速解决方法:将所有权设置为docker容器内的user,但将group设置为外部ec2示例的docker group。
一步一步:
获取ec2-user的组ID:

id -G ec2-user

输出可能如下所示:

[ec2-user@ip-10-0-xx-xxx ~]$ id -G ec2-user
500 10 **497**

在这种情况下,497是docker组的id,它只存在于docker shell (ECS-Instance)中。/var/run/docker.sock必须分配给docker组,以便您可以访问它。
Docker容器中的用户ID通常是0(root用户)和1000(标准用户)。为了确保你不会猜到:只需使用docker exec登录到正在运行的docker容器(不要使用-u 0),并在提示符开头检查名称,组id -与上面使用的命令相同!这一次你应该注意到第一个号码。在这个例子中(应该是这样的):1000
另外,请检查正在运行的docker容器中docker.sock的实际设置:ls -la /var/run/docker.sock
这应该显示所有者设置 root 497
数字(组)应该与您以前见过的数字之一匹配。现在你知道该怎么做了:
1.离开docker容器(因为您没有root访问权限来更改所有权)。

  1. sudo chown 1000:497 /var/run/docker.socks
    这意味着您将id 1000的所有者和id 497的组作为root分配给/var/run/docker.socks
    即使给定的id在系统上不存在,此命令也可以工作:用户ID 1000将最有可能仅存在于内部Docker容器内,而组497将仅存在于外部容器中。
    就这样
bsxbgnwa

bsxbgnwa3#

添加到现有的答案,这里是一种使用任务定义JSON的方法。

{
"family": "migrate-images",
"taskRoleArn": "arn:aws:iam::123456789012:role/ecsTaskRole",
"networkMode": "bridge",
"containerDefinitions": [
    {
        "name": "migrate-images",
        "image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/my-docker-in-docker-image:latest",
        "cpu": 256,
        "memory": 512,
        "essential": true,
        "mountPoints": [
            {
                "sourceVolume": "docker_socket",
                "containerPath": "/var/run/docker.sock"
            }
        ]
    }
],
"volumes": [
    {
        "name": "docker_socket",
        "host": {
            "sourcePath": "/var/run/docker.sock"
        }
    }
]
}

相关问题