Gitlab CI 配置与 Laravel Docker Redis 错误的主机或端口

Gitlab CI configuration with Laravel Docker Redis wrong host or port

我正在 .gitlab-ci.yml 文件中为使用 redis 作为缓存驱动程序的 Laravel 项目开发 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
...

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

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

variables:
  REDIS_PORT: 6379

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

这是 Docker 的预期行为。

在 Gitlab CI 中,您定义的所有 services 都将 link 与您的容器一起使用,即 运行 您使用 Docker linking system 的工作。

here 所述,当我们 link 容器时,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 所做的。