无法使用 Docker Compose 提供的 Drupal 应用从 API 获取或 post 数据
Cannot get or post data from API with Drupal app served with Docker Compose
我有一些应用程序 运行在本地通过。 docker 用于开发。 2 天前他们工作正常,但昨天出现了一个错误。我使用 curl 从远程主机上的 API 获取数据,昨天它停止工作,现在仍然无法工作。获取数据的curl命令是
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, getenv('DATABASE_URL'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data, '', '&'));
$output = curl_exec($ch)
curl_close($ch);
return $output;
现在 returns 出现错误,提示我没有使用 API 的权限。这当然不能告诉你太多,所以让我详细介绍一下这些应用程序。
它们是 drupal 8 应用程序,由 docker(和 docker-compose)提供服务。我检查过他们是否可以访问互联网(稍后会详细介绍),并且该应用程序与本地 mysql 服务器的连接工作正常。我已尝试重新启动 docker、重建容器以及此类标准 hack,但似乎没有任何解决办法。我有一个 laravel 应用程序在本地与 docker 一起使用,使用相同的 API,这个应用程序可以从 API 检索和 post 数据,所以问题似乎与 drupal 代码有关。虽然这可能不是真的,因为在这开始发生之前我已经尝试使用旧版本,但仍然出现同样的错误。这让我认为它也可能是 ssl 证书错误,但我还没有找到测试这个的方法。
我注意到的一些奇怪的事情:
- 在我们控制的远程服务器上提供的 drupal 应用程序(具有相同代码)的生产版本正在运行,并且它使用相同的 API(Ubuntu 是 运行在本地和远程服务器上)。
- 当我打开我的电脑时,应用程序(laravel 和 druppal)没有互联网,我必须停止并开始(使用 docker-compose down and up)让他们上网。
我知道这根本不足以找出这里到底出了什么问题,但我希望有人以前可能已经看到过其中的一些问题,并给出修复问题的提示。
一如既往,如果您需要应用程序的任何特定代码或说明,请尽管询问,我很乐意提供。
更新:我忘了补充一点,该应用程序是通过 this 代理提供的,该代理一直在发挥作用。当我 运行 它时,我在我的机器上得到了应用程序“letsencrypt_ser” 运行ning,而不是在 docker 容器中,它占用了超过 100% 的 CPU(4 个核心,因此超过一个核心的价值)。此应用程序不是 运行 在远程服务器上 运行 相同的设置,所以我相信我的容器出现了严重错误。
此外,在我的 drupal 添加的 docker-compose 文件中,我们有代码
networks:
default:
external:
name: webproxy
最后,将容器连接到代理。
您应该在 drupal 8 中使用 \Drupal::httpClient();
而不是 curl(但 curl 也应该有效)。
你的 docker-compose.yml 里有什么?
你们有这样的服务吗?
services:
api:
extra_hosts:
- "my_api_hostname.local:0.0.0.0"
networks:
defaults:
aliases:
- my_api_hostname.local
front:
depends_on:
- api
extra_hosts:
- "my_front_hostname.local:0.0.0.0"
networks:
defaults:
aliases:
- my_front_hostname.local
首先,我想感谢所有参与的人。在某种程度上,你们帮助我到达了现在的位置,工作的地方。
解决办法?完全格式化 ubuntu,清理磁盘并从 16.
升级到 ubuntu 20
我有一些应用程序 运行在本地通过。 docker 用于开发。 2 天前他们工作正常,但昨天出现了一个错误。我使用 curl 从远程主机上的 API 获取数据,昨天它停止工作,现在仍然无法工作。获取数据的curl命令是
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, getenv('DATABASE_URL'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data, '', '&'));
$output = curl_exec($ch)
curl_close($ch);
return $output;
现在 returns 出现错误,提示我没有使用 API 的权限。这当然不能告诉你太多,所以让我详细介绍一下这些应用程序。
它们是 drupal 8 应用程序,由 docker(和 docker-compose)提供服务。我检查过他们是否可以访问互联网(稍后会详细介绍),并且该应用程序与本地 mysql 服务器的连接工作正常。我已尝试重新启动 docker、重建容器以及此类标准 hack,但似乎没有任何解决办法。我有一个 laravel 应用程序在本地与 docker 一起使用,使用相同的 API,这个应用程序可以从 API 检索和 post 数据,所以问题似乎与 drupal 代码有关。虽然这可能不是真的,因为在这开始发生之前我已经尝试使用旧版本,但仍然出现同样的错误。这让我认为它也可能是 ssl 证书错误,但我还没有找到测试这个的方法。
我注意到的一些奇怪的事情:
- 在我们控制的远程服务器上提供的 drupal 应用程序(具有相同代码)的生产版本正在运行,并且它使用相同的 API(Ubuntu 是 运行在本地和远程服务器上)。
- 当我打开我的电脑时,应用程序(laravel 和 druppal)没有互联网,我必须停止并开始(使用 docker-compose down and up)让他们上网。
我知道这根本不足以找出这里到底出了什么问题,但我希望有人以前可能已经看到过其中的一些问题,并给出修复问题的提示。
一如既往,如果您需要应用程序的任何特定代码或说明,请尽管询问,我很乐意提供。
更新:我忘了补充一点,该应用程序是通过 this 代理提供的,该代理一直在发挥作用。当我 运行 它时,我在我的机器上得到了应用程序“letsencrypt_ser” 运行ning,而不是在 docker 容器中,它占用了超过 100% 的 CPU(4 个核心,因此超过一个核心的价值)。此应用程序不是 运行 在远程服务器上 运行 相同的设置,所以我相信我的容器出现了严重错误。
此外,在我的 drupal 添加的 docker-compose 文件中,我们有代码
networks:
default:
external:
name: webproxy
最后,将容器连接到代理。
您应该在 drupal 8 中使用 \Drupal::httpClient();
而不是 curl(但 curl 也应该有效)。
你的 docker-compose.yml 里有什么?
你们有这样的服务吗?
services:
api:
extra_hosts:
- "my_api_hostname.local:0.0.0.0"
networks:
defaults:
aliases:
- my_api_hostname.local
front:
depends_on:
- api
extra_hosts:
- "my_front_hostname.local:0.0.0.0"
networks:
defaults:
aliases:
- my_front_hostname.local
首先,我想感谢所有参与的人。在某种程度上,你们帮助我到达了现在的位置,工作的地方。
解决办法?完全格式化 ubuntu,清理磁盘并从 16.
升级到 ubuntu 20