在dockerfile中安装mysql?

问题描述:

我想编写简单的python应用程序并将其放入docker文件中。我的dockerfile是:在dockerfile中安装mysql?

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 build -t myapp . 

和运行泊坞窗图像与:

docker run -i myapp 

我得到错误:

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

问题是什么?

+0

错误,数据库没有运行?将数据库放在单独的容器中会更容易,更有意义。 – 2015-04-02 19:30:27

+0

我不明白。如何运行数据库。如果我在主机上安装了mysql,并尝试连接到我的主机上的数据库,它应该能够正常工作。这是否意味着我的主机上的数据库正在运行? – 2015-04-02 19:39:09

+0

您应该只搜索您的错误消息:[1](http://*.com/q/11657829/484666),[2](http://*.com/q/11990708/484666), [3](http://*.com/q/11443504/484666) - 它与Docker或您使用它的方式无关。 – scriptin 2015-04-02 20:12:46

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

要明白我的意思,创建下面的脚本,并调用它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这样的进程管理器来解决这个问题,但最简单和最好的解决方案是使用单独的容器。您可以找到库存容器mysql以及python,这将为您节省很多麻烦。要做到这一点:

  1. 采取MySQL安装的东西了你的Python代码Dockerfile
  2. 变化localhost的,无论你想打电话给你的MySQL容器mysql或。
  3. 开始喜欢的东西docker run -d --name mysql mysql
  4. MySQL的容器启动的容器,并链接到MySQL的容器e.g:docker run myapp --link mysql:mysql
+0

我得到了同样的错误。如果我把它分成两个容器,应该在第一个容器中应该在什么位置,并且应该在第二个容器中。我必须把它们联系起来吗? – 2015-04-02 20:47:28

+0

添加了一些说明。是的,链接使事情变得更简单。 – 2015-04-02 21:01:22

+0

在python代码中,我将主机更改为'mysqlserver',它是MySQL容器的名称。但我得到这个错误:未知的MySQL服务器主机'mysqlserver'。 – 2015-04-02 22:03:40