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

use*_*544 79 docker docker-compose

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

cd directory_has_docker-compose.yml && docker-compose up -d 在/etc/rc.local中.

但是当我重新启动机器后,容器无法正常工作.

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

Ole*_*sky 98

当我们使用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
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要在没有-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
Run Code Online (Sandbox Code Playgroud)

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

systemctl enable docker-compose-app
Run Code Online (Sandbox Code Playgroud)

  • 有没有一种简单的方法来测试它是否可以在不重新启动树莓派的情况下工作? (2认同)
  • 这是IMO最优雅的答案 (2认同)
  • @dmigo`systemctl启动docker-compose-app`和`systemctl status docker-compose-app`是我想要的. (2认同)
  • 最佳答案恕我直言。@OlegBelostotsky 你能解释一下为什么非分离版本添加了更多指令吗?`Restart=on-failure; 开始限制间隔秒=60;开始限制爆发=3` (2认同)
  • 这是错误的做法。请参阅下面的答案。原因是它不便携。您将 docker-compose 移动到不同的服务器,并且它的行为方式不同。通过下面的解决方案,使用 restart:always 在文件 docker 本身中处理服务的启动。如果你正确安装了 docker,它就会处理所有事情,这是“正确”的方式。 (2认同)

Max*_*sse 62

你应该能够添加:

restart: always 
Run Code Online (Sandbox Code Playgroud)

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

  • 这是问题的正确答案.有一种设计方法可以重新启动容器,为什么要进入cron作业以及重新发明轮子的其他方法. (9认同)
  • 请记住,它们必须在重新启动时运行,因此请勿在重新启动之前手动停止它们. (6认同)
  • @TahaRehmanSiddiqui注意,“重新启动:始终”有一些严重的错误:例如,重新启动时不会挂载主机座。我认为,如果现有的轮子是方形的,最好重新发明轮子。 (3认同)
  • 为什么“重新启动:始终”而不是“重新启动:除非停止”?两者都应该做我想说的工作 (2认同)

mas*_*ost 32

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

$ sudo systemctl enable docker
Run Code Online (Sandbox Code Playgroud)

和你在你的服务docker-compose.yml

restart: always
Run Code Online (Sandbox Code Playgroud)

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

docker-compose up -d
Run Code Online (Sandbox Code Playgroud)

  • 为什么“重新启动:始终”而不是“重新启动:除非停止”?两者都应该做我想说的工作 (5认同)
  • 这应该是最优雅的解决方案 (3认同)
  • @Lonnie 运行一次相当于添加 crontab。基本上开始撰写一次,“restart:always”将处理剩下的事情。 (2认同)

use*_*544 31

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

解决了这个问题.

crontab -e

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

  • 你应该怀疑他们引入非确定性行为时的睡眠:https://martinfowler.com/articles/nonDeterminism.html#AsynchronousBehavior (4认同)
  • 它还引入了可能不需要的长达30秒的延迟. (3认同)
  • 为什么对这个答案投反对票?答案没有用吗?它在任何意义上都是错误的吗?评论有助于让回答者和其他人知道出了什么问题。 (2认同)
  • @z0r 睡眠不好!睡眠可能“起作用”,但任何启动顺序都应该是确定性的。Linux 服务在启动之前使用依赖关系来确保网络等可用。你也应该这样做。 (2认同)

Vas*_*007 16

使用重启:始终在您的docker compose文件中。

Docker-compose up -d将再次从图像启动容器。使用docker-compose start启动停止容器,它永远不会启动从图像中新的容器。

nginx:   
    restart: always   
    image: nginx   
    ports:
      - "80:80"
      - "443:443"   links:
      - other_container:other_container
Run Code Online (Sandbox Code Playgroud)

您也可以将代码写在docker文件中,以便在具有其他容器依赖性的情况下首先创建代码。

  • 你可能不想使用“always”,但也许“unless-stopped”。其他选项有“on-failure”和“no”。这称为[重新启动策略](https://docs.docker.com/config/containers/start-containers-automatically/)。 (5认同)

Ger*_*niz 14

restart: unless-stopped
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml

  • 人们总是可以手动停止容器。“always”和“unless-stopped”之间的区别在于,如果手动停止容器,则容器不会在启动时以“unless-stopped”启动。如果您手动停止“restart:always”容器,它将保持停止状态,直到下次启动。(或者更确切地说,下次 docker 守护进程重新启动时)。人们无法真正从最流行的答案中推断出这一信息。1. 目前最流行的答案是 systemd 服务文件答案。2.下一个最受欢迎的答案没有提供这些细节。必须阅读“docker-run”的联机帮助页 (4认同)

Tit*_*ter 9

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

@reboot sleep 60 && /usr/local/bin/docker-compose -f /path_to_your_project/docker-compose.yml up -d
Run Code Online (Sandbox Code Playgroud)