docker mysql容器启动后退出

Posted

技术标签:

【中文标题】docker mysql容器启动后退出【英文标题】:docker mysql container exits after being started 【发布时间】:2019-05-06 20:44:34 【问题描述】:

我正在尝试使用初始化脚本启动 docker mysql 容器。我的 Dockerfile 看起来像这样:

FROM node:11
WORKDIR /usr/src/app
COPY ./init.sql /docker-entrypoint-initdb.d/
COPY . .
RUN npm install
ENV PORT=8000
EXPOSE $PORT
CMD [ "npm", "start" ]

我在两个地方都有我的 init.sql 文件,主目录和 docker-entrypoint-initdb.d/ 文件夹。 init.sql 文件只有 create table 和 insert 语句。我按以下顺序运行我的 Docker 命令:

//start network
docker network create --driver bridge mysql-net

//launch docker mysql container with init script to create tables & data
docker run -d --name mysql-server --network mysql-net -p 3306:3306 -e "MYSQL_ROOT_PASSWORD=rootpassword" -e "MYSQL_DATABASE=yelplikeapp" -e "MYSQL_USER=yelplikeapp" -e "MYSQL_PASSWORD=hunter2" -v "/c/Users/marti/Documents/projectFolder:/docker-entrypoint-initdb.d" mysql:5

启动 mysql-server 容器最初可以工作,但在我运行 'docker ps -a' 几秒钟后,我可以看到它一启动就退出:

为什么我的 mysql-server 容器退出了?我一直在尝试进入容器并查看数据库以验证是否已成功创建所有表。但我在这样做时遇到了麻烦,并认为这是问题的根源。

为了透明起见,我将发布完整的 init.sql 文件: 当我检查 mysql-server 的日志时,有一条错误消息说 第 1 行出现错误 1050 (42S01):表 'users' 已存在

drop database yelplikeapp;
create database yelplikeapp;
use yelplikeapp;

SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS businesses;
DROP TABLE IF EXISTS photos;
DROP TABLE IF EXISTS reviews;
SET FOREIGN_KEY_CHECKS = 1;

CREATE TABLE users (
  id MEDIUMINT NOT NULL AUTO_INCREMENT,
  username VARCHAR(255) NOT NULL,  
  PRIMARY KEY (id)
);

INSERT INTO users(id, username) VALUES 
( NULL, 'brungoTungis' ),
( NULL, 'kramer' ),
( NULL, 'elaine');

CREATE TABLE businesses (
  id MEDIUMINT NOT NULL AUTO_INCREMENT,
  ownerid MEDIUMINT NOT NULL,
  name VARCHAR(255) NOT NULL,
  address VARCHAR(255) NOT NULL,
  city VARCHAR(255) NOT NULL,
  state VARCHAR(255) NOT NULL,
  zip VARCHAR(255) NOT NULL,
  phone VARCHAR(255) NOT NULL,
  category VARCHAR(255) NOT NULL,
  subcategory VARCHAR(255) NOT NULL,
  website VARCHAR(255),
  email VARCHAR(255),
  PRIMARY KEY (id),
  FOREIGN KEY (ownerid) REFERENCES users(id) ON DELETE CASCADE
);

INSERT INTO businesses(id, ownerid, name, address, city, state, zip, phone, category, subcategory, website, email) VALUES ( NULL, 1, 'taco bell', '1157th ave nw', 'corvallis', 'or', '98023', '423-232-1313', 'fastfood', 'mexican', 'www.tacobell.com', 'tacobell@gmail.gov' ), ( NULL,  1, 'kfc', '1158th ave nw', 'seattle', 'wa', '98223', '423-232-993', 'fastfood', 'chicken', NULL, NULL );

CREATE TABLE photos (
  id MEDIUMINT NOT NULL AUTO_INCREMENT,
  userid MEDIUMINT NOT NULL,
  businessid MEDIUMINT NOT NULL,
  caption VARCHAR(255),
  PRIMARY KEY (id),
  FOREIGN KEY (userid) REFERENCES users(id),
  FOREIGN KEY (businessid) REFERENCES businesses(id) ON DELETE CASCADE
);

INSERT INTO photos(id, userid, businessid, caption) VALUES 
( NULL, 2, 1, 'coolcaption' ),
( NULL, 3, 2, NULL ),
( NULL, 3, 1, 'badcaption');

CREATE TABLE reviews (
  id MEDIUMINT NOT NULL AUTO_INCREMENT,
  userid MEDIUMINT NOT NULL,
  businessid MEDIUMINT NOT NULL,
  dollars MEDIUMINT NOT NULL,
  stars MEDIUMINT NOT NULL,
  review VARCHAR(255),
  PRIMARY KEY (id),
  FOREIGN KEY (userid) REFERENCES users(id),
  FOREIGN KEY (businessid) REFERENCES businesses(id)
);

INSERT INTO reviews(id, userid, businessid, dollars, stars, review) VALUES 
( NULL, 2, 1, 2, 3, 'mycoolreview' ), ( NULL, 1, 2, 2, 3, NULL );

【问题讨论】:

您可以尝试执行“docker logs CONTAINER_ID”来检查 MySql 容器上失败的原因。 你的 SQL 肯定不是问题 @ŁukaszGawron 检查了日志,发现错误提示“用户表已存在”,将尝试添加“如果存在则删除表;”每次创建表之前对我的 sqlfile 的语句并重新构建我的 mysql-server 容器 不确定为什么要将 SQL 脚本复制到您提供的 Dockerfile 中的此节点容器。你能解释一下吗? @ŁukaszGawron 我认为这是将我的 init.sql 文件复制到 mysql-server 容器中所必需的。我还用我的新 sql 代码更新了我的帖子。即使在没有该复制命令的情况下运行它后,我仍然收到“用户表已存在”错误 【参考方案1】:

解决了它,我从我的 dockerfile 中删除了复制语句,并删除了我的 init.sql 文件。我的项目文件中有两个,一个在我的 homeRepo/init.sql 和 homeRepo/docker-entrypoint-initdb .d/

我删除了 homeRepo/init.sql 文件,重新运行了我的 docker mysql-server 创建,它工作了

【讨论】:

以上是关于docker mysql容器启动后退出的主要内容,如果未能解决你的问题,请参考以下文章

如何避免Docker容器启动脚本运行后自动退出

docker-compose内mysql 挂载数据库目录,启动时mysql容器自动退出

docker 容器重启策略

docker容器运行后退出,怎么才能一直运行?

docker 容器启动后立马退出的解决方法

Docker启动后开启或关闭自启容器