How can I make a dockerized Go program with a Redis server inside?

460 views
Skip to first unread message

Rayland

unread,
Apr 17, 2015, 4:18:43 AM4/17/15
to golan...@googlegroups.com
My Dockerfile looks like this:

FROM golang:onbuild
RUN go get [...]
RUN apt-get update && apt-get install -y redis-server
CMD redis-server
CMD go run main.go

My program needs Redis server listening on the default port 6379 and I get connection refused.

rjeczalik

unread,
Apr 17, 2015, 4:43:22 AM4/17/15
to Rayland, golang-nuts
On 17 April 2015 at 10:18, Rayland <guian...@gmail.com> wrote:
>
> My program needs Redis server listening on the default port 6379 and I get connection refused.

It's more about Docker than Go, but add "EXPOSE 6379" to your Dockerfile and use -P flag when running the container.

Rayland

unread,
Apr 17, 2015, 4:50:13 AM4/17/15
to golan...@googlegroups.com, guian...@gmail.com
Why would I use EXPOSE when Redis is inside the same container as my program? I tried your way just to check and it doesn't work.

rjeczalik

unread,
Apr 17, 2015, 5:24:24 AM4/17/15
to Rayland, golang-nuts
On 17 April 2015 at 10:50, Rayland <guian...@gmail.com> wrote:
>
> Why would I use EXPOSE when Redis is inside the same container as my program? I tried your way just to check and it doesn't work.

I shot in the dark that you connect from outside. Now my bet is on redis server rejects your connection due to authentication issues.

Gijs

unread,
Apr 17, 2015, 7:01:46 AM4/17/15
to golan...@googlegroups.com
Unless something has changed since I last experimented with Docker (which could be the case, it's been a year), you can't have multiple CMD statements in your Dockerfile. You'll either need to have a separate container running redis or start it as a daemonized in the same CMD you start your Go application.

Gijs Kunze

unread,
Apr 17, 2015, 7:16:24 AM4/17/15
to Guianu Leon, golan...@googlegroups.com
This seems similar to your issue, so maybe supervisor can help you.

http://stackoverflow.com/questions/23692470/why-cant-i-use-docker-cmd-multiple-times-to-run-multiple-services

On Fri, Apr 17, 2015 at 1:06 PM Guianu Leon <guian...@gmail.com> wrote:
Yes it seems you are right, but if I use RUN instead of CMD to start the Redis server it still doesn't work and it will also output the server in the shell which is something I don't want. I want it to be in the background for my app to use it.

--
You received this message because you are subscribed to a topic in the Google Groups "golang-nuts" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/golang-nuts/WXHWRexuLLA/unsubscribe.
To unsubscribe from this group and all its topics, send an email to golang-nuts...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Rayland

unread,
Apr 17, 2015, 7:41:55 AM4/17/15
to golan...@googlegroups.com, guian...@gmail.com
I tried it and it will just output the Redis server....

Martin

unread,
Apr 17, 2015, 7:51:56 AM4/17/15
to Rayland, golan...@googlegroups.com
This really is about docker and has nothing to do with go at all.

I suggest these parts for you:


And this is basically what you are trying to do (note this is the church of 1 process per container):


It should be easily transferable to running a redis container and a second one with your go application. If that doesn't work for you you simply need to go the supervisor route (or any process monitor of choice, thou I hear systemd inside docker isn't quite there yet)

/Martin

You received this message because you are subscribed to the Google Groups "golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts...@googlegroups.com.

Guianu Leon

unread,
Apr 17, 2015, 7:57:48 AM4/17/15
to Martin, golan...@googlegroups.com
Yes I tried starting a container from the official Redis image and connect its default port to 6379 on host and then I started my app's container and I get connection refused. I then tried using --link and it still doesn't work. The Redis container works ok because I can use redis-cli to acces it.

Egon

unread,
Apr 17, 2015, 9:45:55 AM4/17/15
to golan...@googlegroups.com, mar...@marcher.name
What does your golang code look like?

Yucong Sun

unread,
Apr 17, 2015, 9:48:27 AM4/17/15
to Egon, golan...@googlegroups.com, mar...@marcher.name
What you need: is to use https://github.com/phusion/baseimage-docker
Which includes a "runit" init system inside the image, and it will run
happily whatever daemon you want it to run.

Guianu Leon

unread,
Apr 17, 2015, 10:06:19 AM4/17/15
to Egon, golan...@googlegroups.com, Martin Marcher
It's a small program that outputs some text in the terminal.

Egon

unread,
Apr 17, 2015, 10:08:55 AM4/17/15
to golan...@googlegroups.com, egon...@gmail.com, mar...@marcher.name
On Friday, 17 April 2015 17:06:19 UTC+3, Rayland wrote:
It's a small program that outputs some text in the terminal.

I mean the actual program - i.e. what library it uses to connect to redis, how does it select the redis host/port?

Guianu Leon

unread,
Apr 17, 2015, 10:42:37 AM4/17/15
to Egon, golan...@googlegroups.com, Martin Marcher
menteslibres.net\gosexy\redis

It uses localhost and Redis default port 6379

Egon

unread,
Apr 17, 2015, 2:46:09 PM4/17/15
to golan...@googlegroups.com, mar...@marcher.name
Linking works fine for me with that library.
Are you using the correct HOST/PORT that is exported via linking to the Go container?

+ Egon


On Friday, 17 April 2015 14:57:48 UTC+3, Rayland wrote:

Guianu Leon

unread,
Apr 17, 2015, 3:09:40 PM4/17/15
to Egon, golan...@googlegroups.com, Martin Marcher
I don't think I understand what you mean. My Go app tries to connect to 127.0.0.1:6379 and my Redis container is exporting its 6379 port to 6379 port from host.

Egon

unread,
Apr 17, 2015, 3:27:24 PM4/17/15
to golan...@googlegroups.com, mar...@marcher.name, egon...@gmail.com
On Friday, 17 April 2015 22:09:40 UTC+3, Rayland wrote:
I don't think I understand what you mean. My Go app tries to connect to 127.0.0.1:6379 and my Redis container is exporting its 6379 port to 6379 port from host.

I got it working via running a redis container and then running the Go app in a container that is linked to that redis container.

This works for connecting to a redis container (started with just docker run redis) https://play.golang.org/p/JoJSi6nW3f.

If you run it inside a container, this is needed:

docker run --link your_redis:redis your_app

Rick

unread,
Apr 17, 2015, 6:40:40 PM4/17/15
to golan...@googlegroups.com, mar...@marcher.name, egon...@gmail.com
Docker containers cannot connect to 127.0.0.1. It's a loopback address and isn't routed. The "docker --link container_name:hostname" option adds the bridge IP address of container_name to the /etc/hosts file of the container that's doing the linking, associating it with the hostname occurring after the ":".  Programs running inside the container doing the linking can use that hostname to connect to the linked container. Bottom line - you can't use 127.0.0.1 inside a Docker container.
Reply all
Reply to author
Forward
0 new messages