在dockerfile中安装mysql?

Posted

技术标签:

【中文标题】在dockerfile中安装mysql?【英文标题】:Install mysql in dockerfile? 【发布时间】:2015-06-07 21:00:45 【问题描述】:

我想编写简单的 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)")

有什么问题?

【问题讨论】:

Err,数据库没有运行?将数据库放在单独的容器中会更容易也更有意义。 我不明白。如何运行数据库。如果我在主机上安装 mysql,并尝试连接到主机上的数据库,它应该可以正常工作。这是否意味着我主机上的数据库正在运行? 您应该只搜索您的错误消息:1、2、3 - 它与 Docker 或您使用它的方式无关。 只是在Docker中db没有像Ubuntu正常启动一样默认启动。 【参考方案1】:

问题是您从未启动过数据库——您需要在大多数 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 的库存容器,这将为您省去很多麻烦。为此:

    从 Dockerfile 中取出 mysql 安装的东西 将您的 Python 代码中的 localhost 更改为 mysql 或任何您想要调用 MySQL 容器的名称。 用docker run -d --name mysql mysql 之类的东西启动一个 MySQL 容器 启动您的容器并链接到 mysql 容器,例如:docker run myapp --link mysql:mysql

【讨论】:

我遇到了同样的错误。如果我把它放在两个容器中,第一个容器应该是什么,第二个容器应该是什么。我必须链接它们吗? 添加了一些说明。是的,链接让事情变得更容易。 在 python 代码中,我将主机更改为“mysqlserver”,这是 MySQL 容器的名称。但是我收到了这个错误:未知的 MySQL 服务器主机 'mysqlserver'。 听起来你打错字了 - /etc/hosts 中有什么? 我真的帮不了你了。我认为你需要找个人和你一起坐下来看看这些东西。不过,您可以使用docker run exec CONTAINER cat /etc/hosts

以上是关于在dockerfile中安装mysql?的主要内容,如果未能解决你的问题,请参考以下文章

在 Dockerfile 中安装节点?

如何使用 dockerfile 在 centos docker 容器中安装 mongodb-org-tools?

构建一个 docker 镜像 ros2 ,当尝试运行时。在 dockerfile 中安装/setup.bash 无效

如何在docker中安装redis

Docker中安装MySQL

zabbix6.0安装教程:从容器中安装