我有一个 Docker 镜像,用作构建服务器来为我的 Web 应用程序构建 Docker 镜像。
在 Docker 内部运行 Docker 并非易事,因为大多数 PAAS 不允许特权模式。但是我有一个在 EC2 上运行的 Docker 守护进程,我在我的构建服务器中使用该守护进程使用
DOCKER_HOST
env 参数(使用 PEM 来保护连接)。它已经运行了大约一年。
现在我想在 Lambda 上运行它。一个很大的区别是 Lambda 使除
/tmp
之外的所有内容都是只读的。我使用docker version
来验证连接。当我的构建脚本到达这个命令时,它失败了:
> DOCHER_HOST=ssh://[email protected] docker version
Client: Docker Engine - Community
Version: 23.0.1
API version: 1.42
Go version: go1.19.5
Git commit: a5ee5b1
Built: Thu Feb 9 19:46:56 2023
OS/Arch: linux/amd64
Context: default
error during connect: Get "http://docker.example.com/v1.24/version": fork/exec /usr/bin/ssh: operation not permitted
在那个构建服务器中,直接运行ssh没有问题:
> /usr/bin/ssh [email protected] pwd
/home/ubuntu
> which ssh
/usr/bin/ssh
> echo $(whoami)
sbx_user1051
看起来 Docker 要么试图写入只读文件系统,要么 docker 没有运行 ssh 命令的权限?权限不是我的强项,所以我花了几天时间从其他网站尝试这些类型的命令。我在构建服务器的 Dockerfile 中这样做:
RUN chmod 777 /root
RUN chmod 777 /usr
RUN chmod 777 -R /root
RUN chmod 777 -R /usr
RUN groupadd docker
RUN usermod -aG docker $USER
RUN usermod -aG docker sbx_user1051
RUN newgrp docker
RUN chmod 777 /var/run/docker.sock
注意:我知道这些是危险的权限。只是想让它工作,然后我会适当地取消它。
我走到了死胡同,因为我不知道如何进一步解决这个问题。有什么建议吗?