python - 在dockerfile中安装mysql?

标签 python mysql docker mariadb dockerfile

我想编写简单的 python 应用程序并将 docker 容器与 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 镜像:

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 程序),事情会变得有点复杂。你要么必须使用像主管这样的流程管理器,要么在你的启动脚本中更聪明一点。

要明白我的意思,请创建以下脚本,并将其命名为 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 不会收到代理给它的信号,因此当容器停止时可能不会正确关闭。您可以通过使用像主管这样的流程管理器来解决这个问题,但最简单和最好的解决方案是使用单独的容器。您可以找到 mysql 的库存容器也适用于 python ,这样可以省去很多麻烦。为此:

  1. 从 Dockerfile 中取出 mysql 安装的东西
  2. 将 Python 代码中的 localhost 更改为 mysql 或任何您想调用 MySQL 容器的名称。
  3. 使用类似 docker run -d --name mysql mysql
  4. 的方式启动 MySQL 容器
  5. 启动您的容器并链接到 mysql 容器,例如:docker run myapp --link mysql:mysql

关于python - 在dockerfile中安装mysql?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29420870/

相关文章:

mysql 多锁,单行

mysql - 有没有办法在 MySQL 中修剪几个字符(忽略它们的组合)?

python - 检查 Pandas 数据框列中的重复值

python - 在 Django 中提供文件而不暴露目录结构

python gevent websocket 客户端收到错误 "DecodeError: Truncated message"回显 Protocol Buffer 消息

mysql - 找不到 mysql 进程的最大打开文件数(ulimit)的来源

python - 迭代 python 字典中的单个维度

macos - Docker如何清理图像的部分失败下载?

nginx - Docker Nginx反向代理

azure - Docker 和 AzureKeyVault : unable to load shared library 'libsecret-1.so.0'