我正在使用以下 docker-compose 来初始化一个数据库服务,它将被 Web 服务使用。
<!-- language: YAML -->
version: '3'
services:
web:
build:
context: .
dockerfile: container-build/web/Dockerfile
ports:
- "8080:80"
volumes:
- /home/johndoe/src/proj:/var/www/public_html
links:
- db
db:
image: mariadb:10.4.7
ports:
- "6603:3306"
restart: always
environment:
- MYSQL_DATABASE=mydb
- MYSQL_ROOT_PASSWORD=12345678
- MYSQL_USER=dbuser
- MYSQL_PASSWORD=12345678
volumes:
- "mysql_data:/var/lib/mysql"
- /home/johndoe/src/proj/data/schema.sql:/docker-entrypoint-initdb.d/schema.sql
volumes:
mysql_data: { driver: local }
然后我按如下方式构建和运行容器:
docker-compose build
docker-compose up
正如您在日志中看到的,数据库 mydb 未初始化,这已通过在容器内运行 shell 并尝试访问数据库来确认。因此,没有创建 root 用户,没有创建数据库,也没有导入架构。有趣的是,环境变量已经被导入到容器中,所以它们在 cotainer 的 shell 中是可用的,例如 echo $MYSQL_USER prints dbuser,这是我们在docker -compose 文件中定义的。
另一个表明 docker-compose.yml 没有做它应该做的事情的证据是当我浏览http://localhost:8080/test.php 时,它具有以下内容:
<!-- language: php -->
<?php
echo "Testing database<br>";
try{
$db = new PDO('mysql:dbname=mydb;host=db', 'dbuser', '12345678');
}catch(PDOException $e){
echo $e->getMessage();
return;
}
?>
这个页面显示:
<!-- language: plain -->
Testing database
SQLSTATE[HY000] [1045] Access denied for user 'dbuser'@'172.19.0.3' (using password: YES)
另一方面,在命令行上运行 mariadb 映像并将这些环境变量和指向 schema.sql 的卷传递到命令行工作并初始化数据库。例如,以下命令有效:
<!-- language: lang-bash -->
docker run --name mariadbtest --rm -ti -d -e "MYSQL_ROOT_PASSWORD=12345678" -e "MYSQL_USER=dbuser" -e MYSQL_PASSWORD=12345678 -v /home/johndoe/src/proj/data/schema.sql:/docker-entrypoint-initdb.d/schema.sql mariadb
那么,我的 docker-compose.yml 有什么问题?Adam Culp的YouTube视频使用了非常相似的 docker-compose.yaml。
Helenr