[英]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.