我有一个使用 Docker、Python、MySQL、MySQL Connector 和 Grafana 的项目。当我不使用 docker 时,我可以运行 Python 程序并将数据发送到 MySQL。我能够创建容器。 Grafana 和 MySQL 容器保持运行,但 Python 容器由于连接错误而关闭。我的猜测是因为 Python 在 MySQL 之前启动,但我不确定我将如何解决这个问题或测试我的理论。
我的项目由四个文件组成。它们是 Docker-Compose.yml、Dockerfile、requirements.txt 和 startTemp.py。下面是我的代码 提前致谢。
Dockerfile:
FROM python:3.9-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "startTemp.py"]
需求.txt:
mysql-connector-python==8.0.25
Docker-Compose.yml
version:"3"
services:
grafana:
image:grafana/grafana
container_name: grafana
restart: always
ports:
- 3000:3000
networks:
- temperature_network
volumes:
- grafana_data:/var/lib/grafana
depends_on:
- mysql
mysql:
image: mysql:latest
container_name: mysql
restart: always
networks:
- temperature_network
volumes:
- mysql_data:/var/lib/mysql
environment:
XXXXXXXXXXXXXXXXXXXXXXXXX
depends_on:
- python
python:
build: .
container_name: python
networks:
- temperature_network
networks:
temperature_network:
volumes:
grafana_data:
mysql_data:
startTemp.py:
from __future__ import print_function
import mysql.connector
from mysql.connector import errorcode
import random
import time
from time import localtime, strftime
DB_NAME = 'temperature'
TABLES = {}
TABLES['chamber_probe_green'] = (
"CREATE TABLE `chamber_probe_green`("
" `id` INT unsigned NOT NULL AUTO_INCREMENT,"
" `time` TIME NOT NULL,"
" `temp` FLOAT NOT NULL,"
" PRIMARY KEY (ID)"
") ENGINE=InnoDB")
TABLES['chamber_probe_blue'] = (
"CREATE TABLE `chamber_probe_blue`("
" `id` INT unsigned NOT NULL AUTO_INCREMENT,"
" `time` TIME NOT NULL,"
" `temp` FLOAT NOT NULL,"
" PRIMARY KEY (ID)"
") ENGINE=InnoDB")
TABLES['food_probe_yellow'] = (
"CREATE TABLE `food_probe_yellow`("
" `id` INT unsigned NOT NULL AUTO_INCREMENT,"
" `time` TIME NOT NULL,"
" `temp` FLOAT NOT NULL,"
" PRIMARY KEY (ID)"
") ENGINE=InnoDB")
TABLES['food_probe_red'] = (
"CREATE TABLE `food_probe_red`("
" `id` INT unsigned NOT NULL AUTO_INCREMENT,"
" `time` TIME NOT NULL,"
" `temp` FLOAT NOT NULL,"
" PRIMARY KEY (ID)"
") ENGINE=InnoDB")
clock = strftime("%I:%M", localtime())
data = "{:.2f}".format(random.random()*100)
cnx = mysql.connector.connect(XXXXXXXXXXXXXXXXXXXXXXX)
cursor = cnx.cursor()
def create_database(cursor):
try:
cursor.execute(
"CREATE DATABASE {} DEFAULT CHARACTER SET
'utf8'".format(DB_NAME))
except mysql.connector.Error as err:
print("Failed creating database: {}".format(err))
exit(1)
try:
cursor.execute("USE {}".format(DB_NAME))
except mysql.connector.Error as err:
print("Database {} does not exist.".format(DB_NAME))
if err.errno == errorcode.ER_BAD_DB_ERROR:
create_database(cursor)
print("Database {} created successfully.".format(DB_NAME))
cnx.database = DB_NAME
else:
print(err)
exit(1)
for table_name in TABLES:
table_description = TABLES[table_name]
try:
print("Creating table {}: ".format(table_name), end=' ')
cursor.execute(table_description)
except mysql.connector.Error as err:
if err.errno == errorcode.ER_TABLE_EXISTS_ERROR:
print("Already exists.")
else:
print(err.msg)
else:
print("OK")
def insertData():
while(True):
AddDataBlue = ("INSERT INTO chamber_probe_blue "
"(time, temp)"
"VALUES (%s, %s)")
AddDataGreen = ("INSERT INTO chamber_probe_green "
"(time, temp)"
"VALUES (%s, %s)")
AddDataYellow = ("INSERT INTO food_probe_yellow "
"(time, temp)"
"VALUES (%s, %s)")
AddDataRed = ("INSERT INTO chamber_probe_blue "
"(time, temp)"
"VALUES (%s, %s)")
dataBlue = (clock, data)
dataGreen = (clock, data)
dataYellow = (clock, data)
dataRed = (clock, data)
print("Adding Blue Data")
cursor.execute(AddDataBlue, dataBlue)
print("Adding Green Data")
cursor.execute(AddDataGreen, dataGreen)
print("Adding Yellow Data")
cursor.execute(AddDataYellow, dataYellow)
print("Adding Red ddata")
cursor.execute(AddDataRed, dataRed)
cnx.commit()
time.sleep(2)
insertData()
cursor.close()
cnx.close()
Docker 日志中列出的错误:
python | File "/usr/local/lib/python3.9/site-packages/mysql/connector/network.py", line 574, in open_connection
python | self.sock.connect(sockaddr)
python | ConnectionRefusedError: [Errno 111] Connection refused