在 dockerfile 中安装 mysql?
Install mysql in dockerfile?
我想编写简单的 python 应用程序并放入 docker 容器和 docker 文件。我的 docker 文件是:
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 程序),事情会变得有点复杂。您要么必须使用像 supervisor 这样的流程管理器,要么在您的启动脚本中更聪明一些。
为了明白我的意思,创建以下脚本,并将其命名为 cmd.sh
:
#!/bin/bash
mysqld &
python main.py
将其添加到 Docker 文件中:
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 and also for python 的库存容器,这会为您省去很多麻烦。为此:
- 从 Docker 文件中取出 mysql 安装内容
- 将 python 代码中的
localhost
更改为 mysql
或任何您想给 MySQL 容器命名的名称。
- 用
docker run -d --name mysql mysql
之类的东西启动一个 MySQL 容器
- 启动您的容器并link到mysql容器例如:
docker run myapp --link mysql:mysql
我想编写简单的 python 应用程序并放入 docker 容器和 docker 文件。我的 docker 文件是:
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 程序),事情会变得有点复杂。您要么必须使用像 supervisor 这样的流程管理器,要么在您的启动脚本中更聪明一些。
为了明白我的意思,创建以下脚本,并将其命名为 cmd.sh
:
#!/bin/bash
mysqld &
python main.py
将其添加到 Docker 文件中:
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 and also for python 的库存容器,这会为您省去很多麻烦。为此:
- 从 Docker 文件中取出 mysql 安装内容
- 将 python 代码中的
localhost
更改为mysql
或任何您想给 MySQL 容器命名的名称。 - 用
docker run -d --name mysql mysql
之类的东西启动一个 MySQL 容器
- 启动您的容器并link到mysql容器例如:
docker run myapp --link mysql:mysql