How to run docker-compose at bootup?

24,144

Solution 1

Simply use crontab, instead of using a time intervall simply say @reboot

So login as the user who should start this script and type the command

crontab -e

and then enter

@reboot /better/enter/fullpath/here/docker-compose -f /usr/bin/myapp/docker-compose.yml -p myapp start

Reboot the system and see if it works. There's one advantage over upstart, even it it is started a little bit later, you don't have to worry much about dependcies like networking, etc. to be up already.

Solution 2

Assuming you're using version 2 of Docker Compose definitions in you docker-compose.yml, you can do the following:

Defining restart: always like so:

version: '2'
services:
  web:
    image: nginx
    restart: always

Reference: https://docs.docker.com/compose/compose-file/compose-file-v2/

Solution 3

Docker is not ready immediately If you run the script too early, nothing will happen. The docker will start responding to the docker ps command as soon as it is ready so you can use this trick in crontab:

nano /etc/crontabs/root

@reboot /usr/bin/docker ps && /usr/bin/docker-compose -f /prod.yml start

Share:
24,144

Related videos on Youtube

Edward
Author by

Edward

Updated on September 18, 2022

Comments

  • Edward
    Edward over 1 year

    This is on an Ubuntu 14.04 LTS VM running Docker and I suspect respawn is the cause of my problem but not sure of the ideal solution.

    Current upstart script (cat /etc/init/dockersuitecrm.conf)

    description "Start docker containers"
    author "Batman"
    start on filesystem and started docker
    stop on runlevel [!2345]
    respawn
    script
        docker-compose -f /usr/bin/myapp/docker-compose.yml -p myapp start
    end script
    

    This 'works' in that myapp is alive and responsive but /sbin/init takes up all the CPU when I monitor with htop. If I remove the entry from upstart (sudo rm /etc/init/dockersuitecrm.conf) and manually SSH in and run docker-compose -f /usr/bin/myapp/docker-compose.yml -p myapp start I don't see the cpu at 100% issue and as before myapp is again alive and responsive.

    So I suspect the way I'm starting docker-compose above is incorrect. What's the right way to start docker-compose is always running without manual intervention?

    EDIT: Shouldn't matter but /usr/bin/myapp -> /home/batman/dockerapps/myapp as a symbolic link.

    • Edward
      Edward about 9 years
      Not a solution but as a work-around, I'm able to run this without the respawn command in the script.
    • Mark Lopez
      Mark Lopez almost 9 years
      Same question, but I saw this: serverfault.com/questions/615820/…. The magic is with using docker-compose start.
    • KCD
      KCD over 7 years
      Don't you just want to run docker-compose in the background? i.e. docker-compose up -d
    • Lu32
      Lu32 about 7 years
      put restart: always in the container spec
  • Justin Smith
    Justin Smith almost 8 years
    Any idea how clean a reboot would be running it this way?
  • Otheus
    Otheus almost 7 years
    Sorry, but this is not a very good answer. It might work from time to time, but as cron might be loaded before other docker requirements, you run into a race condition.
  • Otheus
    Otheus almost 7 years
    The question is, which docker's site doesn't answer, was: "What's the right way to start docker-compose is always running without manual intervention?"