将CSV文件上载到MySQL Docker容器时的权限问题
我正在创建一个MySQL 5.7 Docker容器,并希望在容器启动时创建和填充一个数据库 首先,Dockerfile:将CSV文件上载到MySQL Docker容器时的权限问题,mysql,docker,Mysql,Docker,我正在创建一个MySQL 5.7 Docker容器,并希望在容器启动时创建和填充一个数据库 首先,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 接下来,kdd\u db\u create\u tables.sql的内容: DROP DATABAS
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
接下来,kdd\u db\u create\u 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;
最后,docker编写文件:
---
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
文件结构如下:
|-- docker-compose.yml
|-- mysql
|-- Dockerfile
|-- data
| |-- kdd_dataset.csv
|-- scripts
|-- kdd_db_create_tables.sql
也就是说,SQL脚本位于/mysql/scripts
,而数据集位于/mysql/data
。在容器执行时,SQL脚本在容器中的文件夹/docker entrypoint initdb.d
中可用,而数据集在/var/lib/mysql files
中(因为加载数据填充
要求文件位于所述文件夹中)。但是,当我运行容器时,会出现以下错误:
ERROR 13 (HY000) at line 50: File '/var/lib/mysql-files/kdd_dataset.csv' not found (Errcode: 13 - Permission denied)
知道我做错了什么吗?嗯,问题似乎在于我的(内部)基础设施提供商提供我家的方式。在我家里不可能安装任何东西:-(
使用/tmp代替我遇到了同样的问题,这就是我解决这个问题的方法 1)Dokerfile
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)容器启动脚本(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
#Build the docker image
./database build
#Init the container (start + import data)
./database init