在docker中连接mysql失败



我正在设置一个Dockerfile,在那里我可以运行我的自动化测试,并且我在连接到mysql数据库时遇到了问题。

Dockerfile依赖于以前构建的图像,看起来像这样:

# Stage 0, assign argument as multistage image alias
ARG PHP_IMAGE
FROM ${PHP_IMAGE} as image
# Stage 1, start tests
FROM php:7.2-fpm
RUN curl -sS https://getcomposer.org/installer | php 
&& chmod +x composer.phar && mv composer.phar /usr/local/bin/composer
RUN apt-get update && apt-get install -y gnupg
RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - && 
apt-get install -yq nodejs build-essential 
git unzip 
libfreetype6-dev 
libjpeg62-turbo-dev 
libmcrypt-dev 
libpng-dev 
subversion 
&& curl -sL https://deb.nodesource.com/setup_8.x | bash - 
&& pecl install mcrypt-1.0.1 
&& docker-php-ext-enable mcrypt 
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ 
&& docker-php-ext-install -j$(nproc) gd 
&& docker-php-ext-install -j$(nproc) mysqli
RUN apt-get install -y mysql-server
RUN /etc/init.d/mysql start
RUN mysqladmin -u root -p status
RUN yes | pecl install xdebug 
&& echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" > /usr/local/etc/php/conf.d/xdebug.ini 
&& echo "xdebug.remote_enable=on" >> /usr/local/etc/php/conf.d/xdebug.ini 
&& echo "xdebug.remote_autostart=off" >> /usr/local/etc/php/conf.d/xdebug.ini
RUN npm install -g npm
COPY --from=image /var/www/html/ /var/www/html/
WORKDIR /var/www/html/
COPY scripts/develop.sh develop.sh
COPY scripts/docker-test.sh docker-test.sh
RUN ["/bin/bash", "-c", "bash develop.sh && bash docker-test.sh"]

我添加了RUN mysqladmin -u root -p status,试图调试为什么连接到mysql失败,我得到了

输入密码:mysqladmin:连接到"localhost"上的服务器失败错误:'无法通过套接字连接到本地MySQL服务器'/var/run/mysqld/mysqld.sock'(2"没有这样的文件或目录"('检查mysqld是否正在运行,并且套接字:"/var/run/mysqld/mysqld.sock"是否存在!

要运行此操作,我正在运行

docker build -t $TEST_DOCKER_NAME --build-arg PHP_IMAGE=$DOCKER_IMAGE_NAME_PHP -f Dockerfile.test .

CCD_ 2和CCD_ 3存储在env文件中并从中读取。PHP镜像构建得很成功,我用它将文件从那里复制到这里,这样我就可以运行PHPUnit了。

当我删除RUN行时,当我试图运行创建数据库的脚本时,我的构建失败

mysqladmin:连接到"localhost"上的服务器失败错误:'无法连接到'localhost'上的MySQL服务器(99"无法分配请求的地址"('检查mysqld是否在localhost上运行,端口是否为3306。您可以通过执行"telnet localhost 3306"进行检查

我需要在Dockerfile中做什么才能使其工作?

回答您的具体问题

这是人们在使用docker时经常犯的错误。当您在docker中使用RUN指令时,您正在运行一个命令直到完成,捕获文件系统更改,然后退出。

所以当你有

RUN /etc/init.d/mysql start
RUN mysqladmin -u root -p status

第一个是启动mysql。但随后会捕获更改,退出容器,然后启动一个新容器来运行mysqladmin命令。因此,mysql进程不再运行。

为了避免这种情况,你可以将它们组合成一条像一样的单行

RUN /etc/init.d/mysql start && mysqladmin -u root -p status

然而,每次您想使用mysql时都需要这样做。例如在您的develop.sh中。

更广泛的答案

不建议在您的容器中运行多个进程,也不建议在容器中使用init.d或其他系统启动框架。

您似乎将容器视为虚拟机,并且由于容器不是虚拟机而出现问题。

我建议您探索在一个单独的容器中运行mysql,然后使用像docker-compose这样的工具来启动和停止您的容器。

最新更新