DCDBS: Easy docker-compose Databases

A common problem I tend to face when starting a project is setting up databases. Even when I use docker-compose to do the job, the steps are repetitive and configuration of each individual db is hard to remember. Thus, dcdbs. It’s a docker-compose.yml file with a bit of everything I’ve used via docker-compose. You can find a continuously updated version on my GitHub.

Databases include MongoDB, ElasticSearch, PostgreSQL and Redis. I threw in a web-based admin interface for each database. I’ve included Portainer to manage docker itself. Finally, I added a local version of httpbin to test sensitive APIs.

To bootstrap a new project, either just clone dcdbs and use as-is or use it after deleting anything you don’t need. You can actually get by with using a common docker-compose.yml file for small projects. That’s what I tend to do.

I’ll keep this blog post updated as I make changes to the contents but refer to the repository’s README.md and also the docker-compose.yml file for information on how to get started.

Note that I only tested dcdbs on Docker for Linux. It should run on docker-machine since it is nothing but Linux. I cannot make promises about performance on native docker for Windows and Macintosh.

Have fun and happy hacking!

Find and Replace with Sed: Rename Golang Packages

I just consolidated my GitHub, Twitter and Instagram handle. They are the same as the .com domain I bought for this blog. As I renamed my GitHub handle, I also needed to fix import paths and rename golang packages hosted there.

I used Sed, everybody’s (and also their parents’ and their grandparents’) favourite stream editor. It’s from 1974 – the same year Judas Priest released their debut album, Rocka Rolla. Because Sed is available on all platforms and works directly with text files, you could re-use this recipe outside golang.

The syntax to find and replace strings recursively across files in the current directory looks like this:

sed -i 's/github.com/oldname//github.com/newname//g' **/*.go

Super simple eh? All you need to remember is the following:

  • The flag -i asks for an in-place edit (i.e, replace content in the files)
  • The operator s/ asks for a substitution.
  • The /g at the en informs Sed that the substitution is global – it is to be done for all matching occurrences.
  • The original package name and the new package name come between the s/ and the /g, separated by a forward slash /.
  • We need to use back-slashes to escape regular slashes that occur within the text we’re searching for and the text that is being replaced (I had to replace github.com/oldname/ with github.com/newname/)
  • **/*.go is used to recursively hunt down all .go files from the directory we are operating out of.

I suggest doing these kind of operations only after you have checked in code into GitHub so that if the worst happens you can restore a working copy from there. Always do a git diff between the old version and the new version to see what has changed. You could also use Meld if you want to compare directories that contain multiple git repositories:

meld oldfolder newfolder

There’s a lot more to sed than simple substitutions; so head over to a more in-depth tutorial like https://opensourceforu.com/2011/04/sed-explained-part-1/ or https://www.tutorialspoint.com/unix/unix-regular-expressions.htm to learn more!