Python 在dockerfile中安装mysql?

Python 在dockerfile中安装mysql?,python,mysql,docker,mariadb,dockerfile,Python,Mysql,Docker,Mariadb,Dockerfile,我想编写简单的python应用程序,并将docker conteiner与dockerfile放在一起。我的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 my

我想编写简单的python应用程序,并将docker conteiner与dockerfile放在一起。我的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 run -i myapp
并使用以下命令运行docker映像:

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

问题是什么?

问题是您从未启动过数据库-您需要在大多数Docker映像中显式启动服务。但是,如果您想在Docker中运行两个进程(DB和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将不会获得代理给它的信号,因此当容器停止时,可能不会正常关闭。您可以通过使用流程管理器(如主管)来解决此问题,但最简单和最好的解决方案是使用单独的容器。您可以找到和的库存容器,这将为您节省很多麻烦。为此:

  • 从Dockerfile中删除mysql安装内容
  • 将python代码中的
    localhost
    更改为
    mysql
    或任何您想要调用mysql容器的内容
  • 使用类似于
    docker run-d——名称MySQL-MySQL
  • 启动您的容器并链接到mysql容器,例如:
    docker运行myapp——链接mysql:mysql

  • 呃,数据库没有运行吗?把数据库放在一个单独的容器中会更容易,也更有意义。我不明白。如何运行数据库。若我在主机上安装mysql,并尝试连接到主机上的数据库,它就会正常工作。这是不是意味着我主机上的数据库正在运行?你应该只搜索你的错误消息:,-它与Docker或你使用它的方式无关。只是Docker中的db没有像Ubuntu中那样默认启动。我得到了相同的错误。如果我把它分为两个容器,第一个容器应该装什么,第二个容器应该装什么。我必须链接它们吗?添加了一些说明。是的,链接使事情变得更简单。在python代码中,我将主机更改为“mysqlserver”,这是MySQL容器的名称。但是我得到了这个错误:未知的MySQL服务器主机“mysqlserver”。听起来像是你输入了一个错误-在/etc/hosts中有什么?我真的不能再帮你了。我想你需要找个人和你一起坐下来,看看这些东西。不过,您可以只执行
    docker运行exec CONTAINER cat/etc/hosts