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 所做的。
我正在 .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 所做的。