wercker.com连接到MySQL数据库

背景

我正在尝试使用http://wercker.com为Yii2应用程序构build一些自动化testing。 我创build了自己的Docker仓库https://hub.docker.com/r/consynki/yii2/ ,它提供了一个简单的LAMP堆栈。

我正在使用Docker仓库作为我的wercker.yml文件中的框,用几个简单的步骤来设置我的应用程序,初始化数据库,然后运行我的phpunittesting

box: consynki/yii2 build: steps: - script: name: Update enviroment dependencies code: |- curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer - script: name: Install Composer dependencies code: |- rm -rf ./vendor /usr/bin/composer install --no-interaction --prefer-source - script: name: Apache site install code: |- sudo chmod -R 755 /var/www sudo cp -r ./ /var/www/example.lan/ sudo chown -R $USER:$USER /var/www/example.lan/ sudo cp ./config/example.lan.conf /etc/apache2/sites-available/example.lan.conf sudo a2ensite example.lan.conf sudo cp -fr ./config/hosts /etc/hosts sudo service apache2 restart - script: name: Create database code: |- mysql -uroot -e "SHOW DATABASES;" mysql -uroot -e "CREATE DATABASE IF NOT EXISTS test" - script: name: PHPUnit integration tests code: |- ./vendor/bin/phpunit --configuration phpunit.xml 

问题

问题是,当我使用wercker CLI wercker build运行我的构build时,它无法连接到mysql。 我不断收到以下连接错误ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)尝试运行“创build数据库”步骤时, ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

  - script: name: Create database code: |- mysql -uroot -e "SHOW DATABASES;" mysql -uroot -e "CREATE DATABASE IF NOT EXISTS test" 

我知道docker容器有一个MySQL连接,因为我可以ssh到它并运行mysql -uroot -e "SHOW DATABASES;"

编辑我目前正在进行的工作wercker灯模板可在https://github.com/levi-putna/php-cli-template

请求

我知道wercker.com是比较新的,没有很多的文档。 但是我希望有人能够提供一个在werckertesting运行中如何使用mysql的例子。

编辑 – 使用Wercker服务

我也尝试使用Wercker MariaBD服务进行连接,这不完全是MySQL,所以不是真正的testing我的生产环境,但应该足够好,以开始testing。

我更新我的wercker.yml以添加mariadb服务。 简化我的步骤,以获得数据库连接的东西工作。

 box: consynki/yii2 services: - id: mariadb # your credentials for Docker Hub username: $USERNAME password: $PASSWORD tag: latest # set the required environment variable env: MYSQL_ROOT_PASSWORD: mypassword MYSQL_DATABASE: test_database MYSQL_USER: admin MYSQL_PASSWORD: test123 build: steps: - script: name: Create database code: |- mysql -h $MARIADB_PORT_3306_TCP_ADDR -P $MARIADB_PORT_3306_TCP_PORT -u $MYSQL_USER -p test123 -v mysql -h $MARIADB_PORT_3306_TCP_ADDR -P $MARIADB_PORT_3306_TCP_PORT -u $MYSQL_USER -p test123 -e "SHOW DATABASES;" 

我似乎仍然得到了与我原来的方法相同的错误。 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

在wercker步骤退出之后,我还看到一些额外的日志消息。

 WARNING Box container has already stopped. Initializing database 2016-03-01 22:51:00 140429748197312 [Note] /usr/sbin/mysqld (mysqld 10.1.12-MariaDB-1~jessie) starting as process 51 ... 2016-03-01 22:51:00 140429748197312 [Note] InnoDB: Using mutexes to ref count buffer pool pages 2016-03-01 22:51:00 140429748197312 [Note] InnoDB: The InnoDB memory heap is disabled 2016-03-01 22:51:00 140429748197312 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins 2016-03-01 22:51:00 140429748197312 [Note] InnoDB: Memory barrier is not used 2016-03-01 22:51:00 140429748197312 [Note] InnoDB: Compressed tables use zlib 1.2.8 2016-03-01 22:51:00 140429748197312 [Note] InnoDB: Using Linux native AIO 2016-03-01 22:51:00 140429748197312 [Note] InnoDB: Using SSE crc32 instructions 2016-03-01 22:51:00 140429748197312 [Note] InnoDB: Initializing buffer pool, size = 256.0M 2016-03-01 22:51:00 140429748197312 [Note] InnoDB: Completed initialization of buffer pool 2016-03-01 22:51:00 140429748197312 [Note] InnoDB: The first specified data file ./ibdata1 did not exist: a new database to be created! 2016-03-01 22:51:00 140429748197312 [Note] InnoDB: Setting file ./ibdata1 size to 12 MB 2016-03-01 22:51:00 140429748197312 [Note] InnoDB: Database physically writes the file full: wait... 2016-03-01 22:51:01 140429748197312 [Note] InnoDB: Setting log file ./ib_logfile101 size to 48 MB 2016-03-01 22:51:01 140429748197312 [Note] InnoDB: Setting log file ./ib_logfile1 size to 48 MB 2016-03-01 22:51:01 140429748197312 [Note] InnoDB: Renaming log file ./ib_logfile101 to ./ib_logfile0 2016-03-01 22:51:01 140429748197312 [Warning] InnoDB: New log files created, LSN=45883 2016-03-01 22:51:01 140429748197312 [Note] InnoDB: Doublewrite buffer not found: creating new 2016-03-01 22:51:01 140429748197312 [Note] InnoDB: Doublewrite buffer created 2016-03-01 22:51:01 140429748197312 [Note] InnoDB: 128 rollback segment(s) are active. 2016-03-01 22:51:01 140429748197312 [Warning] InnoDB: Creating foreign key constraint system tables. 2016-03-01 22:51:01 140429748197312 [Note] InnoDB: Foreign key constraint system tables created 2016-03-01 22:51:01 140429748197312 [Note] InnoDB: Creating tablespace and datafile system tables. 2016-03-01 22:51:01 140429748197312 [Note] InnoDB: Tablespace and datafile system tables created. 2016-03-01 22:51:01 140429748197312 [Note] InnoDB: Waiting for purge to start 2016-03-01 22:51:01 140429748197312 [Note] InnoDB: Percona XtraDB (http://www.percona.com) 5.6.28-76.1 started; log sequence number 0 2016-03-01 22:51:01 140428963710720 [Note] InnoDB: Dumping buffer pool(s) not yet started 2016-03-01 22:51:03 140216194230208 [Note] /usr/sbin/mysqld (mysqld 10.1.12-MariaDB-1~jessie) starting as process 80 ... 2016-03-01 22:51:03 140216194230208 [Note] InnoDB: Using mutexes to ref count buffer pool pages 2016-03-01 22:51:03 140216194230208 [Note] InnoDB: The InnoDB memory heap is disabled 2016-03-01 22:51:03 140216194230208 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins 2016-03-01 22:51:03 140216194230208 [Note] InnoDB: Memory barrier is not used 2016-03-01 22:51:03 140216194230208 [Note] InnoDB: Compressed tables use zlib 1.2.8 2016-03-01 22:51:03 140216194230208 [Note] InnoDB: Using Linux native AIO 2016-03-01 22:51:03 140216194230208 [Note] InnoDB: Using SSE crc32 instructions 2016-03-01 22:51:03 140216194230208 [Note] InnoDB: Initializing buffer pool, size = 256.0M 2016-03-01 22:51:03 140216194230208 [Note] InnoDB: Completed initialization of buffer pool 2016-03-01 22:51:03 140216194230208 [Note] InnoDB: Highest supported file format is Barracuda. 2016-03-01 22:51:03 140216194230208 [Note] InnoDB: 128 rollback segment(s) are active. 2016-03-01 22:51:03 140216194230208 [Note] InnoDB: Waiting for purge to start 2016-03-01 22:51:03 140216194230208 [Note] InnoDB: Percona XtraDB (http://www.percona.com) 5.6.28-76.1 started; log sequence number 1616799 2016-03-01 22:51:04 140215410722560 [Note] InnoDB: Dumping buffer pool(s) not yet started 2016-03-01 22:51:06 140659046377408 [Note] /usr/sbin/mysqld (mysqld 10.1.12-MariaDB-1~jessie) starting as process 109 ... 2016-03-01 22:51:06 140659046377408 [Note] InnoDB: Using mutexes to ref count buffer pool pages 2016-03-01 22:51:06 140659046377408 [Note] InnoDB: The InnoDB memory heap is disabled 2016-03-01 22:51:06 140659046377408 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins 2016-03-01 22:51:06 140659046377408 [Note] InnoDB: Memory barrier is not used 2016-03-01 22:51:06 140659046377408 [Note] InnoDB: Compressed tables use zlib 1.2.8 2016-03-01 22:51:06 140659046377408 [Note] InnoDB: Using Linux native AIO 2016-03-01 22:51:06 140659046377408 [Note] InnoDB: Using SSE crc32 instructions 2016-03-01 22:51:06 140659046377408 [Note] InnoDB: Initializing buffer pool, size = 256.0M 2016-03-01 22:51:06 140659046377408 [Note] InnoDB: Completed initialization of buffer pool 2016-03-01 22:51:06 140659046377408 [Note] InnoDB: Highest supported file format is Barracuda. 2016-03-01 22:51:06 140659046377408 [Note] InnoDB: 128 rollback segment(s) are active. 2016-03-01 22:51:06 140659046377408 [Note] InnoDB: Waiting for purge to start 2016-03-01 22:51:06 140659046377408 [Note] InnoDB: Percona XtraDB (http://www.percona.com) 5.6.28-76.1 started; log sequence number 1616809 2016-03-01 22:51:06 140658262116096 [Note] InnoDB: Dumping buffer pool(s) not yet started ERROR: 1049 Unknown database 'test' 2016-03-01 22:51:06 140659046377408 [ERROR] Aborting 

您可以使用由Wercker准备的现成的MySQL服务器,而不是设置自己的。 这将确保它在呼叫之间持续。

看看这个文件 。

说明

好吧,我设法使用@ Tal的build议来获得数据库连接的工作。 Wercker docks只提供一个使用MariaDB的例子,幸运的是MySQL有一个docker容器,几乎和MariaDB版本几乎完全一样。

我添加了新的容器作为服务到我的wercker.yml。

 services: - id: mysql # your credentials for Docker Hub username: $USERNAME password: $PASSWORD tag: latest # set the required environment variable env: MYSQL_ROOT_PASSWORD: mypassword MYSQL_DATABASE: test_database MYSQL_USER: admin MYSQL_PASSWORD: test123 

然后,我可以使用MySQL服务公开的环境variables,在我的Wercker步骤中连接到数据库。

  - script: name: Create database code: mysql -h$MYSQL_PORT_3306_TCP_ADDR -P$MYSQL_PORT_3306_TCP_PORT -uroot -p$MYSQL_ENV_MYSQL_ROOT_PASSWORD -e "CREATE DATABASE IF NOT EXISTS test;" 

我也可以使用PHP中的环境variables连接到数据库。

 class SampleTest extends PHPUnit_Framework_TestCase { public function testSetupWorking() { $this->assertEquals(true, true); $this->assertFalse(false); } public function testDatabase() { $hostname = $_SERVER["MYSQL_PORT_3306_TCP_ADDR"]; $username = 'root'; $password = $_SERVER["MYSQL_ENV_MYSQL_ROOT_PASSWORD"]; $database = $_SERVER["MYSQL_ENV_MYSQL_DATABASE"]; try { $dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password); $this->assertFalse(false); } catch (PDOException $e) { echo $e->getMessage(); $this->assertFalse(true, $e->getMessage()); } } } 

我完整的wercker.yml看起来像这样,你可以在https://github.com/levi-putna/php-cli-template看到我的完整模板。 这只是一个例子,你想要清理PHP连接数据库的步骤和方式,但是这是一个很好的起点。

答案 – 完整wercker.yml

 services: - id: mysql # your credentials for Docker Hub username: $USERNAME password: $PASSWORD tag: latest # set the required environment variable env: MYSQL_ROOT_PASSWORD: mypassword MYSQL_DATABASE: test_database MYSQL_USER: admin MYSQL_PASSWORD: test123 box: consynki/yii2 build: steps: - script: name: Show Enviroment code: printenv - script: name: Update enviroment dependencies code: | sudo DEBIAN_FRONTEND=noninteractive apt-get --no-install-recommends -y install curl php5-cli php5-curl git curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer cd $WERCKER_SOURCE_DIR - script: name: Install Composer dependencies code: | rm -rf ./vendor /usr/bin/composer install --no-interaction - script: name: Serve application code: php -S localhost:8000 >> /dev/null & - script: name: Create database code: mysql -h$MYSQL_PORT_3306_TCP_ADDR -P$MYSQL_PORT_3306_TCP_PORT -uroot -p$MYSQL_ENV_MYSQL_ROOT_PASSWORD -e "CREATE DATABASE IF NOT EXISTS test;" - script: name: PHPUnit integration tests code: ./vendor/bin/phpunit --configuration phpunit.xml 

我已经build立连接到MySQL使用以下configuration:

 box: ruby:2.1.9 build: services: - id: mysql # your credentials for Docker Hub username: $USERNAME password: $PASSWORD tag: 5.5.55 # set the required environment variable env: MYSQL_ROOT_PASSWORD: roo MYSQL_USER: testuser MYSQL_PASSWORD: testuser MYSQL_DATABASE: testdb steps: - bundle-install - rails-database-yml - script: name: echo ruby information code: | echo "ruby version $(ruby --version) running!" echo "from location $(which ruby)" echo -p "gem list: $(gem list)" - script: name: Set up db code: | touch db/schema.rb bundle exec rake db:migrate RAILS_ENV=test - script: name: rspec code: bundle exec rspec 

关于rails-database-yml步骤的信息可以在这里find