如何在Google Cloud Run中启动Docker守护进程以运行docker-compose?
在Google Cloud Run中运行Docker相关服务的解决方案
首先明确:Cloud Run的运行环境是受限的容器环境,默认不支持直接启动Docker守护进程(dockerd),这是因为它没有完整挂载cgroup子系统,也不允许特权容器模式,所以你遇到的Devices cgroup isn't mounted错误是环境限制导致的。
以下是两种可行的替代方案,适配Cloud Run的架构:
方案一:使用Cloud Run多容器部署(推荐)
Cloud Run支持在单个服务中运行多个容器,这些容器共享同一个网络命名空间(可通过localhost互相通信),完全可以替代你原来的docker-compose架构:
- 将docker-compose中的每个服务(Flask应用、其他依赖服务)分别打包成独立的Docker镜像,推送到Google Container Registry(GCR)或Artifact Registry
- 创建Cloud Run服务时,配置多容器:
- 每个容器对应一个原服务,设置好各自的镜像地址
- 若需要对外暴露端口,只需在主容器(或需要对外提供服务的容器)中配置端口映射
- 容器间通信直接使用
localhost:端口,和你在Compute Engine上的方式一致
示例Cloud Run多容器配置片段(yaml):
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: my-multi-container-service spec: template: spec: containers: - name: flask-app image: us-docker.pkg.dev/my-project/my-repo/flask-app:latest ports: - containerPort: 5000 - name: dependent-service image: us-docker.pkg.dev/my-project/my-repo/dependent-service:latest ports: - containerPort: 8080
方案二:使用Sysbox运行Docker-in-Container(仅适用于必须动态启动容器的场景)
如果你的业务逻辑必须在容器内动态启动Docker容器,可以使用Sysbox-runc替代默认的runc,它不需要特权模式即可运行Docker,且能绕过cgroup限制:
- 基于Ubuntu 22.04构建自定义镜像,安装Docker和Sysbox:
FROM ubuntu:22.04 # 安装依赖 RUN apt-get update && apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release # 安装Docker RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null RUN apt-get update && apt-get install -y docker-ce docker-ce-cli containerd.io # 安装Sysbox RUN curl -fsSL https://download.nestybox.com/sysbox/releases/v0.6.4/sysbox-debs/v0.6.4.tar.gz | tar -C /tmp -xz RUN dpkg -i /tmp/sysbox-debs/*.deb # 配置Docker使用Sysbox runtime RUN echo '{ "runtimes": { "sysbox-runc": { "path": "/usr/bin/sysbox-runc" } } }' > /etc/docker/daemon.json - 启动Docker守护进程时指定sysbox runtime:
dockerd --add-runtime sysbox-runc=/usr/bin/sysbox-runc & - 在Cloud Run中部署该镜像时,需注意资源配额限制,Cloud Run底层运行时已兼容Sysbox。
重要提醒
Cloud Run是无状态的无服务器平台,设计用于处理短期、无状态的请求。如果你的业务需要长期运行的容器或复杂的容器编排,建议考虑使用Google Kubernetes Engine(GKE),它更适合这类场景。
内容的提问来源于stack exchange,提问作者user293895
相关产品推荐
相关产品推荐

