docker - 无法从容器内访问Docker API

标签 docker sockets curl docker-compose docker-api

我可以对Docker API进行cUrl调用,但是如果我从容器(docker-compose)运行相同的脚本,则无法访问任何API端点。

我的要求如下:

$ curl --unix-socket /var/run/docker.sock -X POST http:/localhost/containers/json

原因可能是使用本地主机,但暂时找不到解决方案。有什么建议么?

编辑:这是我正在使用(Api-platform https://api-platform.com/)的堆栈的简短摘要。每个容器都连接到“api_default”桥接网络:
  • php =基于Symfony的应用程序
  • nginx = NGINX Web服务器
  • psql =托管主数据库
  • mssql =用于同步数据
  • ...

  • 我的“php”容器中确实有一个shell脚本,该脚本旨在访问Docker API。总而言之,我请求“mssql”容器与外部服务同步,然后请求“psql”容器复制那些数据(通过共享卷使用csv文件完成的导出/导入)。

    问题是 :
  • 如果我执行docker-compose exec php bin/console app:sync(运行脚本的Symfony命令),则一切正常:容器通过docker.sock与Docker API通信,并且我可以同步数据库。
  • 但是,如果我使用api端点(localhost:8080 / api / sync)或通过VueJS应用(Axios)运行相同的脚本,则Docker API永远不会返回无响应。

  • 以下是我的脚本的一部分:
    curl -XPOST -H 'Content-Type: application/json' \
          --unix-socket /var/run/docker.sock http:/localhost/containers/mssql/exec \
          -d '{
            "AttachStdout":true,
            "Tty":true,
            "Cmd":["/opt/mssql-tools/bin/sqlcmd", ...]
          }'
    

    这是我在api端点Controller中调用Symfony命令的方式:
     /**
      * @Route("/api/sync", name="sync", methods={"GET"})
      */
      public function sync(KernelInterface $kernel)
      {
        $application = new Application($kernel);
        $application->setAutoExit(false);
    
        $input = new ArrayInput(array(
            'command' => 'app:sync'
        ));
    
        $output = new BufferedOutput();
        $application->run($input, $output);
        $content = $output->fetch();
    
        return new Response($content);
      }
    

    也许我应该将“localhost”替换为“api_default”以达到良好的网络,但这不起作用...?

    最佳答案

    您尝试连接的本地主机是运行curl的容器中的本地主机
    您应该找到并替换为其主机IP

    关于docker - 无法从容器内访问Docker API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60330390/

    相关文章:

    angular - 如何构建结合了 Angular 和Spring Boot应用程序的Docker镜像?

    Java套接字: My server class constantly takes in input but my client doesn't?

    java - 如何将带有 "-i --upload-file"的 curl 调用转换为 java Unirest 或任何其他 http 请求?

    c - 在 Windows 中使用 ssh 编译 curl 的白痴指南

    mongodb - docker 中的 mongodump 不创建任何文件

    docker - 来自守护程序 : getsockopt: connection refused 的错误响应

    c# - 断开连接后再次开始使用 Socket 进行监听

    linux - connect() 与 unix 域套接字和完整积压

    php - 使用 CURL 将 JSON 数据发布到 API

    apache - 在 80 端口上的主机和 docker 容器中运行 apache