简体   繁体   English

将CSV文件上载到MySQL Docker容器时出现权限问题

[英]Permission issue when uplading a CSV file to a MySQL Docker container

I'm creating a MySQL 5.7 Docker container and would like to create and populate a database at container startup. 我正在创建一个MySQL 5.7 Docker容器,并希望在容器启动时创建并填充一个数据库。

First, the Dockerfile: 首先,Dockerfile:

FROM mysql:5.7

VOLUME /var/lib/mysql-files

ADD ./scripts/kdd_db_create_tables.sql /docker-entrypoint-initdb.d/kdd_db_create_tables.sql

Next, the content of kdd_db_create_tables.sql : 接下来, kdd_db_create_tables.sql的内容:

DROP DATABASE IF EXISTS cdl;
CREATE DATABASE cdl;
USE cdl;

DROP TABLE IF EXISTS kdd;
CREATE TABLE kdd (
   duration BIGINT,
   protocol_type TEXT,
   ..
   class TEXT);

LOAD DATA LOCAL INFILE '/var/lib/mysql-files/kdd_dataset.csv' INTO TABLE kdd FIELDS TERMINATED BY ',';

ALTER TABLE kdd ADD id INT NOT NULL AUTO_INCREMENT PRIMARY KEY;

Finally, the docker-compose file: 最后,docker-compose文件:

---
version: '3.5'
services:
  mysql:
    image: ericsson/mysql5.7:latest
    networks:
      - cdl_net
    ports:
      - 3306:3306
    hostname: mysql
    container_name: mysql
    volumes:
      - ./mysql/data:/var/lib/mysql-files
    environment:
      MYSQL_ROOT_PASSWORD: cdl
      MYSQL_USER: cdl
      MYSQL_PASSWORD: cdl
      MYSQL_DATABASE: cdl

networks:
  cdl_net:
    driver: bridge
     name: cdl_net

The file structure is as follows: 文件结构如下:

|-- docker-compose.yml
|-- mysql
    |-- Dockerfile
    |-- data
    |   |-- kdd_dataset.csv
    |-- scripts
        |-- kdd_db_create_tables.sql

That is, the SQL script is in ./mysql/scripts , while the dataset is in ./mysql/data . 也就是说,SQL脚本位于./mysql/scripts ,而数据集位于./mysql/data Upon container execution, the SQL script is available in the folder /docker-entrypoint-initdb.d in the container, while the dataset is in /var/lib/mysql-files (as LOAD DATA INFILE requires the file to be in said folder). 容器执行后,SQL脚本位于容器中的文件夹/docker-entrypoint-initdb.d中,而数据集位于/var/lib/mysql-files (因为LOAD DATA INFILE要求文件位于该文件夹中)。 However, when I run the container, I get the following error: 但是,当我运行容器时,出现以下错误:

ERROR 13 (HY000) at line 50: File '/var/lib/mysql-files/kdd_dataset.csv' not found (Errcode: 13 - Permission denied)

Any idea about what I'm doing wrong? 关于我在做什么错的任何想法吗?

Well, the problem seems to be in the way my home is provided by my (internal) infrastructure provider. 好吧,问题似乎出在我的(内部)基础架构提供商提供我的房屋的方式上。 It is not possible to mount anything in my home :-( 无法在我家中安装任何东西:-(

Using /tmp instead 改用/ tmp

I ran into the same issue here is what i did to resolve this. 我遇到了相同的问题,这是我为解决此问题所做的事情。

1) The Dokerfile 1)Doker文件

FROM mysql:5.7

# Add a database
ENV MYSQL_DATABASE abahet

# Add the create.sql to the docker image
# All scripts in docker-entrypoint-initdb.d/ are automatically
# executed during container startup
COPY ./create.sql /docker-entrypoint-initdb.d/

# Copy the csv file to /var/lib/mysql-files/ 
COPY ./ratings.csv /var/lib/mysql-files/

2) The container launch script (database.sh) 2)容器启动脚本(database.sh)

#!/bin/bash

CMD=$1

IMAGE_TAG=latest

IMAGE_NAME="my-database"

CONTAINER_NAME="my-database"

DATABASE_NAME="test_db"

MYSQL_ROOT_PASSWORD="root"

DATABASE_PORT="3306"

case $CMD in
    build)
        docker build -t  $IMAGE_NAME .
        ;;
    start)
        CMD="docker run"
        CMD="$CMD --rm"
        CMD="$CMD --net=bridge"
        CMD="$CMD --name $CONTAINER_NAME"
        CMD="$CMD -p $DATABASE_PORT:$DATABASE_PORT"
        CMD="$CMD -e MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD"
        CMD="$CMD -td $IMAGE_NAME:$IMAGE_TAG"
        echo "$CMD"
        eval $CMD
        ;;
    init)
        CMD="docker run"
        CMD="$CMD --rm"
        CMD="$CMD --net=bridge"
        CMD="$CMD --name $CONTAINER_NAME"
        CMD="$CMD -p $DATABASE_PORT:$DATABASE_PORT"
        CMD="$CMD -e MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD"
        CMD="$CMD -td $IMAGE_NAME:$IMAGE_TAG"
        echo "$CMD"
        eval $CMD;

        echo "Waiting for mysql start"
        while ! docker exec -it  $CONTAINER_NAME mysqladmin -p$MYSQL_ROOT_PASSWORD ping &>/dev/null ; do sleep 1 ; done

        sleep 10

        echo "Loading database data"
        docker exec -it $CONTAINER_NAME mysql -p$MYSQL_ROOT_PASSWORD $DATABASE_NAME -e "LOAD DATA LOCAL INFILE 'var/lib/mysql-files/ratings.csv' INTO TABLE rating FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n'";

        ;;
    stop)
        docker stop $CONTAINER_NAME
        ;;
    remove)
        docker rm -f $CONTAINER_NAME
        ;;
    rmi)
        docker rmi -f $CONTAINER_NAME
        ;;
    *)
        echo "Usage : build | start <image_tag> | stop | remove | rmi"
        ;;
esac

exit 0

3) The usage : 3)用法:

In the Terminal execute the following steps : 在终端中执行以下步骤:

 #Build the docker image
./database build 

 #Init the container (start + import data)
./database init

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM