在dockerfile中安装mysql?

我想编写简单的python应用程序,并把dockerfile放在docker conteiner中。 我的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', ) 

当我用以下方式构builddocker映像时:

 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)") 

问题是什么?

问题是你从来没有启动数据库 – 你需要在大多数Docker镜像中明确地启动服务。 但是如果你想在Docker(数据库和你的Python程序)中运行两个进程,事情会变得更复杂一些。 您必须像使用主pipe一样使用stream程pipe理器,或者在启动脚本中稍微聪明一些。

为了明白我的意思,创build下面的脚本,并将其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 

现在build立并再试一次。 (道歉,如果这不起作用,它是closures我的头顶,我还没有testing过)。

请注意,这不是一个好的解决scheme; mysql不会得到代理的信号,所以当容器停止时可能不会正常closures。 你可以通过使用像supervisor这样的进程pipe理器来解决这个问题,但最简单和最好的解决scheme是使用单独的容器。 你可以findMySQL的库存容器,也可以findpython ,这将为您节省很多麻烦。 去做这个:

  1. 把mysql安装的东西从Dockerfile中取出来
  2. 把python代码中的localhost改成mysql或者任何你想要调用你的MySQL容器的东西。
  3. 启动一个像docker run -d --name mysql mysql的MySQL容器
  4. 启动你的容器并链接到mysql容器,例如: docker run myapp --link mysql:mysql