【问题标题】:How to "docker-compose up" for images from Docker Hub如何“docker-compose up”来自 Docker Hub 的图像
【发布时间】:2017-10-28 12:46:31
【问题描述】:

是否可以拉取并启动 docker-compose.yml 中定义的所有容器?我正在尝试执行docker-compose up -d my/image,其中my/image 是DockerHub 上的一个repo,但它显示“找不到docker-compose.yml”。我还尝试先使用docker pull my/image 拉取图像,结果相同

UPD:图片https://hub.docker.com/r/gplcart/core/,来源 - https://github.com/gplcart/docker-core

已解决:似乎 docker-compose 不能按我想要的方式工作。我需要手动创建一个目录,将 docker-compose.yml 放在那里,然后运行docker-compose up

https://docs.docker.com/compose/wordpress/#define-the-project

我希望运行 docker-compose up -d repo/image 足以下载并运行所有定义的容器

【问题讨论】:

  • 您有docker-compose.yaml(或.yml)文件吗? docker-compose 没有一个就不行。
  • 当然,我可以为本地图像运行“docker-compose up”
  • 请发布您的 docker-compose.yml 文件
  • 哦,你有一个 yml 文件,嗯,它似乎是正确的。不过,您需要在项目的根目录中 cd,或者将该目录指定为 dc 的 cmd 行参数:docker-compose -f your_yml_path build

标签: docker docker-compose


【解决方案1】:

要提取图像,请使用docker-compose pull <service_name>,其中service_name 是您的docker-compose.yml 文件中列出的服务之一

docker pull my/image 失败,但应该失败并出现与您指出的不同的错误(您发布了撰写错误)

在您的示例中,my/name 不是有效的服务名称,因为您不能在服务名称中使用 /。 Compose 会给你一个不同的错误。

我不清楚my/name 代表什么(假设你用本地的东西替换了它)。

如果您发布您的docker-compose.yml,这将有助于确定正确的dockerdocker-compose 命令应该是什么。

【讨论】:

    【解决方案2】:

    尝试登录 Docker Hub,以便 Docker Compose 知道您想从那里提取图像。

    从命令行...

    docker login

    系统将提示您输入用户名和密码。一旦通过身份验证,compose 应该在运行 docker-compose up 时从 Docker Hub 中提取您的图像。

    另外,您需要从您的docker-compose.yml 文件所在的同一目录运行docker-compose up。查看您在 Github 上的 docker-compose.yml 文件,您似乎缺少几行。需要指定版本,gplcartdbphpmyadmin应该在services下。

    version: '3'
    services:
      gplcart:
        build: .
        links:
          - db
        ports:
          - 8080:80
      db:
        image: mariadb:10.2
        environment:
          MYSQL_DATABASE: test
          MYSQL_ROOT_PASSWORD: test
        ports:
          - 3306:3306
      phpmyadmin:
        image: phpmyadmin/phpmyadmin:4.7
        links:
          - db
        ports:
          - 8181:80
    

    【讨论】:

    • 我猜“docker login”用于推送。无论如何它没有工作
    • 看起来您的 docker-compose.yml 文件中也缺少行。更新了我的答案。
    • "另外,您需要从 docker-compose.yml 文件所在的同一目录运行 docker-compose up" 是的,但是如果我拉取远程图像,我如何进入该目录?本地图像会很容易。 “docker-compose up remote/image”的全部意义在于自动解决所有问题。我错了吗?
    • 只要您在 docker-compose.yml 中指定正确的图像路径,compose 就会根据您通过身份验证的 docker 注册表,使用 docker login 处理图像的下载。您需要从与您的 docker-compose.yml 文件所在的目录相同的目录中运行 docker-compose up
    【解决方案3】:

    确保dockerdocker-compose 二进制文件来自同一个包管理器。例如

    $ which -a docker docker-compose
    /snap/bin/docker
    /snap/bin/docker-compose
    

    换句话说,如果您从 Snap 安装了 Docker,则应该已经包含了 docker-compose 二进制文件 (ls /snap/docker/current/bin/)。使用 Apt 存储库时,docker-compose 可以单独安装,所以不要在 SnapApt 之间交换二进制文件,也不要将 docker 和 @987654328 混用@Apt 上的包。

    【讨论】:

      【解决方案4】:

      错误Can't find docker-compose.yml 表示您当前不在包含 docker-compose.yml 文件的目录中,或者您已将文件命名为不同的名称。如果您将文件命名为不同的名称,包括不同的大小写或扩展名,您可以重命名文件,或运行docker-compose -f your_filename.yml up 以传递不同的文件以供docker-compose 解析。如果您不在该目录中,请确保在运行 docker-compose 命令之前 cd 进入该目录。

      【讨论】:

        【解决方案5】:

        docker-compose 的行为基于您本地的 docker-compose.yml 文件。使用docker-compose 拉取第三方图像通常很有用,而不是执行单独的docker 命令(为了拉取图像或部署您的应用程序等),而是希望以更结构化的方式定义您的架构喜欢:

        我的docker-compose.yml 文件:

        version: '3'
        
        services:
        
            containerA:
                image: gplcart/core
        
            containerB:
                build: .
                # go on defining the rest ...
        

        和部署:

        docker-compose build && docker-compose up -d

        【讨论】:

          【解决方案6】:

          这是docker-compose.yml文件最简单的工作示例:

          version: '3'
          services:
            hello-world:
              image: hello-world
          

          应该会产生以下结果:

          $ docker-compose up
          Creating network "docker_default" with the default driver
          Creating docker_hello-world_1 ... done
          Attaching to docker_hello-world_1
          hello-world_1  |
          hello-world_1  | Hello from Docker!
          hello-world_1  | This message shows that your installation appears to be working correctly.
          hello-world_1  |
          hello-world_1  | To generate this message, Docker took the following steps:
          hello-world_1  |  1. The Docker client contacted the Docker daemon.
          hello-world_1  |  2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
          hello-world_1  |     (amd64)
          hello-world_1  |  3. The Docker daemon created a new container from that image which runs the
          hello-world_1  |     executable that produces the output you are currently reading.
          hello-world_1  |  4. The Docker daemon streamed that output to the Docker client, which sent it
          hello-world_1  |     to your terminal.
          hello-world_1  |
          hello-world_1  | To try something more ambitious, you can run an Ubuntu container with:
          hello-world_1  |  $ docker run -it ubuntu bash
          hello-world_1  |
          hello-world_1  | Share images, automate workflows, and more with a free Docker ID:
          hello-world_1  |  https://hub.docker.com/
          hello-world_1  |
          hello-world_1  | For more examples and ideas, visit:
          hello-world_1  |  https://docs.docker.com/get-started/
          hello-world_1  |
          docker_hello-world_1 exited with code 0
          

          如果出现问题,请使用以下命令帮助追查问题:

          • docker-compose config - 验证配置文件。
          • docker-compose logs - 查看最新日志。
          • docker info - 检查系统范围的信息。
          • sudo strace -fe network docker-compose up - 调试网络问题。
          • journalctl -u docker.service - 检查 Docker 服务的日志。

          【讨论】:

            猜你喜欢
            • 2018-12-18
            • 1970-01-01
            • 1970-01-01
            • 2022-07-12
            • 1970-01-01
            • 1970-01-01
            • 2022-01-16
            • 2019-07-22
            • 1970-01-01
            相关资源
            最近更新 更多