在Dockerfile中安装MySQL?

12

我想编写一个简单的Python应用程序,并使用Dockerfile将其放入Docker容器中。我的Dockerfile如下:

FROM ubuntu:saucy

# Install required packages
RUN apt-get update
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install python
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install mysql-server python-mysqldb

# Add our python app code to the image
RUN mkdir -p /app
ADD . /app
WORKDIR /app

# Set the default command to execute
CMD ["python", "main.py"]

在我的Python应用程序中,我只想连接到数据库。main.py看起来像这样:

import MySQLdb as db

connection = db.connect(
                host='localhost',
                port=3306,
                user='root',
                passwd='password',
            )

当我使用以下命令构建docker镜像时:

docker build -t myapp .

使用以下命令运行Docker镜像:

docker run -i myapp

我遇到了错误:
_mysql_exceptions.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")

问题是什么?


错误,数据库没有运行? 把数据库放在一个单独的容器中会更容易和更有意义。 - Adrian Mouat
我不明白如何运行数据库。如果我在我的主机计算机上安装了MySQL,并尝试连接到主机上的数据库,它能够正常工作。这是否意味着我的主机上的数据库正在运行? - Vladimir Fejsov
你应该只是搜索你的错误信息:1, 2, 3 - 它与Docker或你使用它的方式无关。 - scriptin
只是因为Docker默认情况下未启动数据库,而Ubuntu通常会启动。 - Adrian Mouat
1个回答

11

问题在于您从未启动数据库 - 大多数Docker镜像都需要显式启动服务。但是,如果您想在Docker中运行两个进程(数据库和Python程序),情况就会变得有些复杂。您必须使用像supervisor这样的进程管理器,或者在启动脚本中更加聪明。

要了解我的意思,请创建以下脚本,并将其命名为cmd.sh

#!/bin/bash

mysqld &
python main.py

将其添加到Dockerfile中:

FROM ubuntu:saucy

# Install required packages
RUN apt-get update
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install python
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install mysql-server python-mysqldb

# Add our python app code to the image
RUN mkdir -p /app
ADD . /app
WORKDIR /app

# Set the default command to execute
COPY cmd.sh /cmd.sh
RUN chmod +x /cmd.sh
CMD cmd.sh

现在进行构建并尝试再次运行。如果无法正常工作,请谅解,这仅仅是我临时想到的,我还没有测试过。

请注意,这不是一个好的解决方案;mysql将无法收到代理信号,因此当容器停止时可能无法正确关闭。您可以通过使用进程管理器(如supervisor)来解决这个问题,但最简单、最好的解决方案是使用独立的容器。您可以找到适用于mysqlpython的标准容器,这将节省您大量麻烦。操作步骤如下:

  1. 从Dockerfile中移除mysql安装部分;
  2. 在您的Python代码中将localhost更改为mysql或您想要称呼MySQL容器的任何名称;
  3. 使用类似docker run -d --name mysql mysql的命令启动MySQL容器;
  4. 启动您的容器,并与mysql容器连接,例如:docker run myapp --link mysql:mysql

我得到了相同的错误。如果我将其分为两个容器,第一个容器应该放什么,第二个容器应该放什么?我必须将它们链接起来吗? - Vladimir Fejsov
在Python代码中,我将主机更改为“mysqlserver”,这是MySQL容器的名称。但是我得到了这个错误:未知的MySQL服务器主机'mysqlserver'。 - Vladimir Fejsov
听起来你打错了字 - /etc/hosts 里面是什么? - Adrian Mouat
我的主机上的/etc/hosts文件? - Vladimir Fejsov
1
我真的无法再帮助你了。我认为你需要找人坐下来,带你一步步地走过这些东西。不过你可以使用 docker run exec CONTAINER cat /etc/hosts - Adrian Mouat
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接