【问题标题】:Gitlab CI configuration with Laravel Docker Redis wrong host or port带有 Laravel Docker Redis 错误主机或端口的 Gitlab CI 配置
【发布时间】:2025-12-14 14:15:01
【问题描述】:

我正在为一个使用 redis 作为缓存驱动程序的 Laravel 项目的 .gitlab-ci.yml 文件中的 Gitlab CI 配置工作。在这个配置文件中,我使用了一个包含所有 linux 包、php 扩展名的图像,这些包在我们的生产环境中使用。这包括由 pecl 安装的 redis 扩展,因此 phpredis 可以在 Laravel 中使用。

在学习了持续集成的过程和gitlab ci文件的配置之后,我在部署镜像时遇到了以下错误:


In PhpRedisConnector.php line 126:

   Redis::connect() expects parameter 2 to be int, string given  

参数应该只是作为 int 的端口,但不知何故变成了 tcp://111.111.11.11:6379

正如https://docs.gitlab.com/ee/ci/services/redis.html 记录的那样,您的.env 中的主机应该是redis,所以我有。在部署期间转储配置导致端口为一些 tcp://111.111.11.11:6379 连接字符串并且主机为空。这在我们的应用程序或我们使用的任何扩展程序中都无法更改。

我在 .gitlab-ci.yml 中使用 https://hub.docker.com/_/redis/ 作为服务。

...
services:
  - name: redis:4
...

【问题讨论】:

    标签: php laravel docker gitlab-ci phpredis


    【解决方案1】:

    在这里找到解决方案: https://laracasts.com/discuss/channels/testing/gitlab-ci-weird-redis-host

    这个变量没有在任何地方记录,但它以某种方式解决了问题。 将以下内容添加到您的 .gitlab-ci.yml 文件中:

    variables:
      REDIS_PORT: 6379
    

    如果有人找到有关此变量的文档以及更多选项,请告诉我!

    【讨论】:

      【解决方案2】:

      这是 Docker 的预期行为。

      在 Gitlab CI 中,您定义的所有 services 都将与使用 Docker linking system 运行您的作业的容器链接。

      正如here 描述的那样,当我们链接容器时,Docker 会自动创建 ENV 格式:

      • <_alias>_NAME
      • <_alias>_PORT
      • 和其他一些 ENVS

      那些来自 Docker 的 ENV 会覆盖你的。

      alias 这里将是您在services 中定义的容器的主机名。例如,您在 .gitlab-ci.yml 中定义这些服务:

      services:
       - redis:5-alpine
       - name: mongo
         alias: db
      

      所以Docker会分别创建以下ENV:

      • REDIS_PORT="有些东西看起来像:tcp://172.17.0.3:6379"
      • REDIS_NAME="看起来像:/runner-72989761-project-19846207-concurrent-0-62507216079cf651-build-3/redis"
      • DB_PORT=和 redis 一样
      • DB_NAME=和 redis 一样

      请注意,如 here 所述,默认情况下,还会根据服务映像的名称自动创建以下 ENV:

      • MONGO_PORT=...
      • MONGO_NAME=...

      因此,在您的代码中,如果您有任何与 Docker 创建的变量同名的变量,您可能需要更改变量的名称,否则它将被 Docker 覆盖。或者你可以使用上面@MmynameStackflow 的解决方案,在你的Gitlab CI 配置文件中传递variables 来覆盖Docker 所做的事情。

      【讨论】: