3

I have a quite typical docker-compose setup: a custom web container and a database container directly from docker hub. For development, my host directory is mounted into the web docker so that I do not have to rebuild container each time I do a minor change. The web server is a Passenger (standalone) serving a ruby app.

When I run it, I have my database running, my web service running (on port 3000), all good. However, if I do a change, nothing changes as the web server (passenger) needs to be relaunched. I would like to have to be able to launch a simple lightweight development server such as thin that I would restart manually when I do a change.

What I tried:

  • Launching a new web container (docker-compose run web ...) does not expose any port for the new container. So, I cannot connect to the web server.
  • Launching a new web container with Docker directly (docker run web -p 5000:5000 image_name ...). We loose the docker-compose functionality, the container is not linked to the database without manual bindings.
  • Relaunching the docker-compose each time (as it starts quickly). Each time my database is relaunched so empty, I need to keep running.
  • Use --service-ports arg: do not work as port 3000 is already used
  • docker exec my dev server on the web container: has to run on another port, so will not be exposed.
  • docker exec the kill of my webserver: actually it works (it restarts), but I do not really like this solution. Firstly, because the server is still Passenger where I would prefer a lightweight web server (as thin). Secondly, I find it not very clean to connect to kill over and over the server with docker exec ....
  • Changing my Dockerfile to replace Passenger by an auto-relaunching dev web server: I like the Dockerfile to be the same as on the prod server, tests, and dev.

Would you have a clean and easy way of just launching my web container, with port 5000 open, on which I would a shell the launch/relaunch a dev web server ?

1
  • I've just moved all the source code into a data container that is exported using SMB to the developer. I wrote Docker Shell for this purpose - dockershell.io. Commented Jun 28, 2015 at 9:01

1 Answer 1

3

I use two docker-compose files, one for development and one for production.

In development the docker-compose file you can override the CMD from your Dockerfile with command so you can easily use bash to have a shell or use an auto relaunch server.

To use you custom docker-compose file do : docker-compose -f dev.yml ...

And for this :

Relaunching the docker-compose each time (as it starts quickly). Each time my database is relaunched so empty, I need to keep running.

If you do docker-compose up --no-deps web it will not relaunch your db

Sign up to request clarification or add additional context in comments.

1 Comment

So you are saying you run a docker compose with a database, and some dev server that just starts bash? Can you give a example of that ? I am seeking to start a mongo, a elasticsearch and a dev server without the server running (just bash it after the run)

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.