每次有人推送代码时,我都会使用gitlab运行单元测试。我在作曲家安装过程中遇到了这个错误。
> Incenteev\ParameterHandler\ScriptHandler::buildParameters
Creating the "app/config/parameters.yml" file
> Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::buildBootstrap
> Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::clearCache
[Doctrine\DBAL\Exception\ConnectionException]
An exception occured in driver: SQLSTATE[HY000] [2002] Connection refused
[Doctrine\DBAL\Driver\PDOException]
SQLSTATE[HY000] [2002] Connection refused
[PDOException]
SQLSTATE[HY000] [2002] Connection refused
Script Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::clearCache handling the post-install-cmd event terminated with an exception
这是我的配置:
.gitlab-ci.yml文件
# Select image from https://hub.docker.com/_/php/
image: php:5.6
# Select what we should cache
cache:
paths:
- vendor/
before_script:
# Install ssh-agent if not already installed, it is required by Docker.
# (change apt-get to yum if you use a CentOS-based image)
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
#
Run ssh-agent (inside the build environment)
- eval $(ssh-agent -s)
# Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store
- ssh-add <(echo "$SSH_PRIVATE_KEY")
# For Docker builds disable host key checking. Be aware that by adding that
# you are suspectible to man-in-the-middle attacks.
# WARNING: Use this only with the Docker executor, if you use it with shell
# you will overwrite your user's SSH config.
- mkdir -p ~/.ssh
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
- cp ci/custom.ini /usr/local/etc/php/conf.d/custom.ini
- bash ci/docker_install.sh > /dev/null
# Install composer
- curl -sS https://getcomposer.org/installer | php
services:
- mysql:latest
variables:
# Configure mysql service (https://hub.docker.com/_/mysql/)
MYSQL_DATABASE: symfony
MYSQL_ROOT_PASSWORD: root
# We test PHP5.6 (the default) with MySQL
test:mysql:
script:
# Install all project dependencies
- php composer.phar install
- phpunit --coverage-text --colors=never -c app/
parameters.yml.dist
parameters:
database_host: 127.0.0.1
database_port: ~
database_name: symfony
database_user: root
database_password: root
mailer_transport: smtp
mailer_host: 127.0.0.1
mailer_user: ~
mailer_password: ~
# A secret key that's used to generate certain security-related tokens
secret: ThisTokenIsNotSoSecretChangeIt
database_slave1_host: 127.0.0.1
database_slave1_port: ~
database_slave1_name: symfony
database_slave1_user: root
database_slave1_password: root
我已阅读并遵循gitlab网站的说明。也许我的错误是显而易见的,但我无法看到它。
答案 0 :(得分:9)
当您使用在另一个容器中运行的MySQL时,您必须使用其主机名,而不是 127.0.0.1 。 正确的数据库主机应该是“mysql”。这包含在GitLab文档的one of the sections中:
MySQL的服务容器可以在主机名mysql下访问。因此,为了访问您的数据库服务,您必须连接到名为mysql的主机,而不是socket或localhost。
答案 1 :(得分:1)
此错误的一个可能问题是您在初始化时尝试访问数据库。这在Docker HUB的MySQL Caveats部分中有所介绍。
如果容器启动时没有初始化数据库,则将创建一个默认数据库。虽然这是预期的行为,但这意味着在初始化完成之前它不会接受传入的连接。使用自动化工具时可能会出现问题...
简单的解决方案是在启动访问数据库的任何进程之前使用sleep
命令。您可以将其添加到before_script
部分:
before_script:
- sleep 60s
更好,更复杂的解决方案是重复检查MySQL服务器,检查它是否已经接受连接。