2015-04-02 64 views
4

我想編寫簡單的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://stackoverflow.com/q/11657829/484666),[2](http://stackoverflow.com/q/11990708/484666), [3](http://stackoverflow.com/q/11443504/484666) - 它與Docker或您使用它的方式無關。 – scriptin 2015-04-02 20:12:46

回答

4

問題是你從未開始數據庫 - 你需要在大多數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