如何在系统启动时运行docker-compose up -d?

时间:2017-04-28 03:28:36

标签: docker docker-compose

为了让容器在启动时自动启动,我尝试添加命令:

/etc/rc.local中的

cd directory_has_docker-compose.yml && docker-compose up -d

但是在重启机器后,容器无法正常工作。

如何在系统启动时运行docker-compose up -d

6 个答案:

答案 0 :(得分:69)

当我们使用crontab或已弃用的/etc/rc.local文件时,我们需要延迟(例如sleep 10,具体取决于计算机),以确保系统服务可用。通常,systemd(或upstart)用于管理系统引导时启动的服务。您可以尝试使用类似的配置:

# /etc/systemd/system/docker-compose-app.service

[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/srv/docker
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target

或者,如果您希望在没有-d标志的情况下运行:

# /etc/systemd/system/docker-compose-app.service

[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service

[Service]
WorkingDirectory=/srv/docker
ExecStart=/usr/local/bin/docker-compose up
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0
Restart=on-failure
StartLimitIntervalSec=60
StartLimitBurst=3

[Install]
WantedBy=multi-user.target

使用docker化项目路径更改WorkingDirectory参数。并使服务自动启动:

systemctl enable docker-compose-app

答案 1 :(得分:39)

您应该可以添加:

restart: always 

要在docker-compose.yml文件中重新启动的每个服务

答案 2 :(得分:26)

我试过restart: always,它适用于某些容器(如php-fpm),但是我遇到了一些容器(如nginx)在重启后仍未重启的问题。

解决了这个问题。

crontab -e

@reboot (sleep 30s ; cd directory_has_dockercomposeyml ; /usr/local/bin/docker-compose up -d )&

答案 3 :(得分:19)

如果您的docker.service在系统启动时启用

$ sudo systemctl enable docker

并且您docker-compose.yml中的服务具有

restart: always

如果仅在命令下运行一次,则所有服务在重新启动系统时运行

docker-compose up -d

答案 4 :(得分:7)

在docker compose文件中使用 restart:always 。 Docker-compose up -d将再次从映像启动容器。使用docker-compose start来启动已停止的容器,它永远不会从映像中启动新的容器。

nginx:   
    restart: always   
    image: nginx   
    ports:
      - "80:80"
      - "443:443"   links:
      - other_container:other_container

还可以将代码编写到docker文件中,以便在依赖于其他容器的情况下首先创建该代码。

答案 5 :(得分:4)

作为user39544的答案的补充,crontab -e还有一种语法:

@reboot sleep 60 && /usr/local/bin/docker-compose -f /path_to_your_project/docker-compose.yml up -d