0%

Docker中无密码apt安装mysql

问题出现

Linux在第一次安装有些软件时会有交互的输入的需求,比如mysql在首次安装时需要设置root的密码。这在正常配置过程中没什么问题,但在使用DockerFile创建docker镜像时,则遇到了麻烦。

解决思路

如果将安装好的mysql-server使用apt remove从系统中卸载后,再次重新安装,则不再需要输入密码。另外当安装完一些软件后,可以使用dpkg-config来重新配置。

这样,就可以在安装软件前先对系统做好相关配置。接下来,就是需要获取软件的必要配置项

获取软件必要配置项

下载软件包

可以通过网上搜索方式下载相关的deb包,但众所周知,Linux的软件包版本多,很多情况下并不知道需要安装哪个版本。但可以使用apt来下载相应的软件包

1
$ apt-get -d install -y mysql-server

使用apt-get的-d参数,将只会下载,不进行安装。下载完毕后,软件包位于/var/cache/apt/archives目录下。

获取配置项

进入软件包的存放目录,然后执行

1
dpkg-preconfigure mysql-server-5.1_5.1.49-3_amd64.deb

使用debconfig-show来查看相应的配置项

1
2
3
4
5
$ debconf-show mysql-server
mysql-server/root_password: (password omitted)
mysql-server/root_password_again: (password omitted)
mysql-server/error_setting_password:
...

可以看到,有两项是必须配置的:mysql-server/root_passwordmysql-server/root_password_again

预配置

  • 创建配置文件

在合适的目录下创建一个文件,例如mysql-passwd,输入以下内容

1
2
debconf mysql-server/root_password password 123456
debconf mysql-server/root_password_again password 123456
  • 加载配置
1
$ debconf-set-selections mysql-passwd

测试结果

再次安装mysql-server,将不再需要输入密码

1
$ apt-get install -y mysql-server

DockerFile处理

DockerFile应当尽量避免不需要的操作,所以,获取配置项的操作可以提前在实验环境中完成。

可将获取的命令行保存为本地文件,使用时copy过去。

1
2
COPY ./mysql-passwd /tmp/mysql-passwd
RUN apt-get update && debconf-set-selections /tmp/mysql-passwd && apt-get install -yqq mysql-server && rm -rf /var/lib/apt/lists/*

或者是在DockerFile中直接生成,这时则可以将mysql passwd设置为参数

1
2
RUN echo debconf mysql-server/root_password password 123456 > /tmp/mysql-passwd && echo debconf mysql-server/root_password_again password 123456 >> /tmp/mysql-passwd
RUN apt-get update && debconf-set-selections /tmp/mysql-passwd && apt-get install -yqq mysql-server && rm -rf /var/lib/apt/lists/*