我正在Travis CI上执行自动化测试。
以下是docker-compose.yml
和.travis.yml
文件。
.travis.yml
dist: trusty
language: php
sudo: required
group: edge
php:
- '5.6'
- '7.1'
services:
- docker
- mysql
git:
quiet: true
before_install:
- sudo chmod +x docker-compose.yml
before_script:
script:
- docker-compose up -d
- docker exec -i travistest_db_1 mysql -uwordpress -pwordpress wordpress < wordpress.sql
docker-compose.yml
version: '3.3'
services:
db:
image: mysql:5.7
volumes:
- ~/db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
image: wordpress:latest
volumes:
- ~/wordpress_data:/var/www/html
depends_on:
- db
ports:
- "8004:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
environment:
MYSQL_USER: root
MYSQL_ROOT_PASSWORD: wordpress
ports:
- "8011:80"
volumes:
db_data:
当我尝试触发SQL查询时,它抛出此错误:
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
read unix @->/var/run/docker.sock: read: connection reset by peer
我已经尝试调试了几个小时,但是还没有运气,有没有人曾经遇到过这个问题并设法解决呢?
是否可以导入SQL文件?
答案 0 :(得分:0)
之所以会这样,是因为在执行以下命令时,MySQL数据库尚未初始化:
docker exec -i travistest_db_1 mysql -uwordpress -pwordpress wordpress < wordpress.sql
运行。您需要临时设置此命令,并且有很多方法可以做到这一点:
[Note] mysqld: ready for connections.
日志中出现travistest_db_1
等到以下命令:
docker inspect -f \
'{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}:3306' \
travistest_db_1
返回0
退出状态(表示端口3306已打开并允许连接)
将docker-compose.yml
文件中的healthcheck用于db
服务(您可以根据需要配置参数):
healthcheck:
test: "cat /proc/net/tcp /proc/net/tcp6 | grep ':0CEA'"
interval: 10s
timeout: 5s
retries: 5
,直到:
docker inspect -f '{{.State.Health.Status}}' \
travistest_db_1
返回healthy
。如果端口cat /proc/net/tcp /proc/net/tcp6 | grep ':0CEA'
(十六进制的0
)绑定在IPv4或IPv6上,则运行状况检查中使用的:0CEA
命令返回:3306
(这意味着MySQL已准备好接受连接)。由于curl
图片中没有像wget
或mysql:5.7
这样的工具,因此这似乎是检查端口是否打开的唯一命令
无论选择哪种解决方案,都必须在docker-compose up
和docker exec
之间添加一条命令以等待繁忙,例如以下使用healthcheck
(我更喜欢的解决方案)的第三种解决方案: / p>
while [ "$(docker inspect -f '{{.State.Health.Status}}' travistest_db_1)" != "healthy" ];
do
sleep 1
done