我正在尝试创建一个自定义的docker映像,里面有mysql数据库。我不需要在容器运行和删除之间挂载卷或持久化任何数据。目标是始终以相同的状态启动容器。将它们用于测试并将其删除。
采取的步骤:
从一般的mariadb映像启动mariadb容器。
docker run --name some-mariadb -e MYSQL_ROOT_PASSWORD=root -d mariadb:10.1.24
1a657ebec5ba
用mysql客户端连接到db创建一个db、用户并授予权限。
mysql -uroot -proot -h 0.0.0.0
mysql> CREATE DATABASE store
mysql> CREATE USER 'store'@'%' IDENTIFIED BY 'store';
mysql> GRANT ALL ON store.* TO 'store'@'%';
mysql> exit
导入数据。
mysql-ustore-pstore-h 0.0.0.0 store<~/mysqldumps/store-2017-06-22-13-55.sql
此时,容器拥有了所需的用户、权限、数据和数据库。
提交到新映像。
Docker提交1A657EBEC5BA my-registry/store-test-db:2017-06-30-15-26
现在,当我从另一个主机上的这个映像启动一个容器时。它只是一个简单的mysql容器,没有我的用户或数据库。
怎样塑造这样的形象才是正确的方法?
你的命令看起来没问题。如何连接到mysql容器?看起来您是在您的主机mysql中工作,而不是在容器中运行的mysql。添加端口映射配置:
因此,按以下方式运行:
docker run -p 3307:3306 --name some-mariadb -e MYSQL_ROOT_PASSWORD=root -d mariadb:10.1.24
然后这样连接到容器MySQL:
mysql -P 3307 -h 127.0.0.1 -uroot -proot
或者,您可以使用Docker Exec
访问mysql终端:
docker exec -it <container-id> mysql -uroot -proot
mysql>
正如@raitisd所调查的,这是由于MySQL/MariaDB基映像中已经定义的卷。
您可以使用此方法解决此问题:
DockerFile:
FROM mariadb:10.1.24
RUN cp -r /var/lib/mysql /var/lib/mysql-no-volume
CMD ["--datadir", "/var/lib/mysql-no-volume"]
生成与运行:
docker build . -t my-mariadb
docker run -e MYSQL_ROOT_PASSWORD=root -it my-mariadb