52

I have a docker container running mysql and I want to push a .sql file to the container and then have mysql execute the commands in it. The first step is fairly straightforward:

docker cp ./dummy.sql <container_id>:/

From there I am trying to run mysql from the command line and point it to the file that I just pushed to the container.

docker exec <container_id> mysql -u root -ppassword < /dummy.sql

This command appears to be trying to use /sample.sql as stdin locally rather than on the container. I also tried wrapping quotes around everything after the container ID which also seems to not work.

I also tried pushing a .sh file with the command in it to the docker container and then just executing that, but that is less ideal and also not working. Any advice?

4 Answers 4

43

If you are going to do pipe redirections in your command, pass it as a string to /bin/sh:

docker exec <container_id> /bin/sh -c 'mysql -u root -ppassword </dummy.sql'
Sign up to request clarification or add additional context in comments.

Comments

37

One does not need to copy the script first. If the script is on the host then:

docker exec -i <container_name> mysql -u root -ppassword <mydb> < /path/to/script.sql

Or if the Use db directive is contained inside the script:

docker exec -i <container_name> mysql -u root -ppassword < /path/to/script.sql

1 Comment

You don't need to use -e or cat. You can simply use docker exec -i <container_name> mysql -u root -ppassword < /path/to/script.sql, assuming that the script is on the host.
1

Try:

docker exec <container_id> 'mysql -u root -ppassword </dummy.sql'

2 Comments

I mentioned trying that except I used double quotes rather than single. I'll try single quotes when I can. When I did that, it seems like docker was trying to execute the entire string as one literal command for some reason.
@Akron if there are no quotes, bash will interpret string first (and pass dummy to stdio) before calling docker.
0

For local sql script use:

docker exec -i <container_name> mysql -u root -p root --database=your_db < ./local/script.sql

For simple sql within terminal use (with no -u -p shortcuts):

docker exec -i <container_name> mysql --user=root --password=root -e "show databases;""

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.