【问题标题】:Running docker compose inside Docker Container在 Docker 容器中运行 docker compose
【发布时间】:2021-05-28 18:18:27
【问题描述】:

我有一个正在构建的 docker 文件,它将使用 Localstack 来启动一个模拟 AWS 环境,此时我使用我的 docker compose 文件在本地执行此操作,所以我想我可以复制我的 docker-compose。 yml 在构建我的 docker 文件时结束,然后从 dockerfile 运行 docker-compose up,我将能够从 dockerfile 创建的容器运行我的应用程序

这里是 docker compose 文件

version: '3.1'

services:
  localstack:
    image: localstack/localstack:latest
    environment:
      - AWS_DEFAULT_REGION=us-east-1
      - EDGE_PORT=4566
      - SERVICES=lambda,s3,cloudformation,sts,apigateway,iam,route53,dynamodb
    ports:
      - '4566-4597:4566-4597'
    volumes:
      - "${TEMPDIR:-/tmp/localstack}:/temp/localstack"
      - "/var/run/docker.sock:/var/run/docker.sock"

这是我的 Dockerfile

FROM node:16-alpine

RUN apk update

RUN npm install -g serverless; \
    npm install -g serverless-localstack;

WORKDIR /app
COPY serverless.yml ./
COPY localstack_endpoints.json ./
COPY docker-compose.yml ./
COPY --from=library/docker:latest /usr/local/bin/docker /usr/bin/docker
COPY --from=docker/compose:latest /usr/local/bin/docker-compose /usr/bin/docker-compose

EXPOSE 3000
RUN docker-compose up
CMD ["sls","deploy" ]

但我收到的错误是

#17 0.710 Couldn't connect to Docker daemon at http+docker://localhost - is it running?
#17 0.710 
#17 0.710 If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.

我是 Docker 新手,当我在线研究错误时,我看到有人说它需要使用 Sudo 运行,尽管我认为在这种情况下,这与我的卷链接到运行容器的主机有关,但是真的不确定。

【问题讨论】:

    标签: linux docker docker-compose operating-system dockerfile


    【解决方案1】:

    在 Docker 容器内尝试访问套接字,但它不能。所以当你想运行你的容器时使用

      -v /var/run/docker.sock:/var/run/docker.sock 
    

    它应该可以解决问题。

    【讨论】:

    • 我在使用 docker build -t serverless/docker 构建时收到此错误。不是在我运行容器时
    • 我认为在 Dockerfiles 中可能是不可能的。你可以用#! 创建一个脚本! /bin/bash docker-compose up -d sls 按照我说的部署和共享套接字并在运行容器后运行脚本
    【解决方案2】:

    作为一般规则,您不能在 Dockerfile 中执行影响持久状态或在容器外运行的进程的操作。想象一下docker building 你的图像,docker pushing 到注册表,docker pulling 在新系统上;如果构建步骤能够启动其他正在运行的容器,它们就不会在不同的系统上使用相同的映像运行。

    在更机械的层面上,构建序列无法访问绑定安装的主机目录或各种其他运行时设置。这就是您收到“无法连接到 Docker 守护程序”消息的原因:构建容器没有运行 Docker 守护程序,并且它无权访问主机的守护程序。

    与尝试让容器嵌入 Compose 工具和 Compose 设置相比,您可能会发现只分发一个 docker-compose.yml 文件并让运行复合应用程序的标准方式在主机上运行 docker-compose up 更容易.对 Docker 套接字的访问非常强大——您几乎可以轻松地使用它来 root 主机——而且我不需要它来避免在主机上需要一个相当标准的工具。

    【讨论】:

    • 我有一个 docker compose 文件,它启动模拟数据库,然后我可以在本地使用我的应用程序,希望创建我的应用程序的容器并在那里旋转模拟数据库。我想我可以在启动我的应用程序 docker 容器时引用主机 localhost,而不是从它内部进行组合?
    • 你能从同一个docker-compose.yml文件中启动这两个部分吗?
    • 我还需要一个 docker 文件来从我的应用程序创建一个容器吗?我用 docker 命令构建和运行它可以在 docker compose 文件中完成吗?
    猜你喜欢
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多