Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

Custom MySQL Docker Instance

DZone 's Guide to

Custom MySQL Docker Instance

Explore a custom MySQL Docker instance.

· Database Zone ·
Free Resource

Hi folks, have you ever been in a situation where you were required to set up or mimic the current MySQL instance of any environment? Well recently, I have been in such a situation, and my use case was to test the overall services, so I decided to use Minikube for service deployment as a whole. Now, when I had to deploy a MySQL instance, it was quite a tedious task to run a normal MySQL container and then source the DB script for the database every time a new container comes up.

Sometimes it was quite annoying because the dump takes 10-15 minutes to get populated. Another issue was that if you think that you can dump the file in a running container and the Docker commit will do the trick, it won't!

Docker commit will take a snapshot of the state, not the data persisted. So today, I'm going to share a solution for this problem. What about creating a custom MySQL image with data preloaded? Let's look at how we can get it done.

Things You'll Need

For this solution to work, you need Docker installed, Dockerfile that has the configuration for the above solution, and your database dump in the same directory where Dockerfile is. Let's call it all_db.sql. We will be using this name throughout the blog.

Some Points to Consider

The thing to consider is how you do the database dump. Just use the --databases flag for mysqldump command and only dump specific databases. So now let's look at the Dockerfile.

FROM mysql:5.7.24 as builder

RUN ["sed", "-i", "s/exec \"$@\"/echo \"not running $@\"/", "/usr/local/bin/docker-entrypoint.sh"]

ENV MYSQL_ROOT_PASSWORD=root

COPY all_db.sql /docker-entrypoint-initdb.d/

RUN ["/usr/local/bin/docker-entrypoint.sh", "mysqld", "--datadir", "/initialized-db"]

FROM mysql:5.7.24

COPY --from=builder /initialized-db /var/lib/mysql

If you look at the Dockerfile, it looks confusing, but believe me, it's pretty straightforward.

So the concept used for this approach is using prebuilt docker images, which means making an image first and then using it afterward as a base image. Similarly, we used the MySQL's base image and aliased it as builder, then we copied our database dump to the appropriate data directory for MySQL i.e; /docker-entrypoint-initdb.d/ and used

RUN ["/usr/local/bin/docker-entrypoint.sh", "mysqld", "--datadir", "/initialized-db"]

so that it runs as a docker build process, which populates our base image with the dump, and lastly, we copy the /initialized-db from our base image to /var/lib/mysql to our final image, and voila, we are done once we build the image using

docker build -t mysql-custom-instance

.

We get our custom MySQL docker image, and you can try running it

docker run -d -p 3307:3306 mysql-custom-instance

or on the host network

docker run -d --network host mysql-custom-instance

In both cases, we require a mysql-client to access the MySQL instance.

You can pull this image from Docker hub and see it in action. The password for user root is root

docker pull shuhamknoldus/mysql-custom-instance

.

Conclusion

That's all for this article. In the next one, we'll look at how we can do the same thing for DynamoDB. Please feel free to drop any questions or suggestions and like if it solved your problem.

Happy coding!

References

Github https://github.com/shubhamknoldus

This article was first published on the Knoldus blog.

Topics:
database ,tutorial ,docker ,mysql ,mysql docker instance

Published at DZone with permission of

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}