【问题标题】:How to make docker container running continuously?如何让docker容器连续运行?
【发布时间】:2021-10-05 12:46:56
【问题描述】:

我有一个 Docker 映像,它实际上是设备的服务器。它是从 Python 脚本开始的,我制作了 .sh 来运行它。但是,每当我运行它时,它都会说它已执行并结束(服务器以代码 0 退出)。我让它工作的唯一方法是通过 docker-compose 当我将它作为分离容器运行时,然后通过 bin/bash 进入容器并从中手动执行运行脚本(前面提到的 .sh),然后退出容器。

之后一切都按预期工作,但是当服务器重新启动时会出现问题。我必须重新手动完成。

有没有其他人经历过类似的事情?如果是,我该如何解决?

启动服务器的文件(start.sh):

#!/bin/sh
python source/server/main.pyc &
python source/server/main_socket.pyc &
python source/server/main_monitor_server.pyc &
python source/server/main_status_server.pyc &
python source/server/main_events_server.pyc &

Dockerfile:

FROM ubuntu:trusty

RUN mkdir -p /home/server

COPY server /home/server/

EXPOSE 8854

CMD [ /home/server/start.sh ] 

Docker 编写:

version: "3.9"
services:
  server:
    tty: yes
    image: deviceserver:latest
    container_name: server
    restart: always
    ports:
      - "8854:8854"
    deploy:
      resources:
        limits:
          memory: 3072M

【问题讨论】:

  • 您在容器中运行的脚本应该记录到标准输出,而不是作为守护进程或后台任务运行。所有这五个进程都需要运行吗?如果是这样,您也许应该考虑为每个进程运行一个单独的容器
  • @IainShelvington 是的,不幸的是,它们都需要在同一个容器中运行。这是我无法改变的。
  • 您可以将tail -f /dev/null 添加为脚本的最后一行。这似乎是一种创建永无止境的流程的流行方式。
  • 为什么不能改变这个?也许像supervisor 这样的东西可能适合你?

标签: python docker shell docker-compose


【解决方案1】:

这不是 docker-compose 的问题。即使使用简单的docker run 启动,您的 docker 容器也不应该返回(即阻塞)。

为此,您的 CMD 应该在前台运行

我认为问题在于您是 start.sh 返回而不是阻塞。您是否尝试过从脚本中删除最后一个“&”(我不熟悉 python 以及这些不同的进程是什么)?

【讨论】:

  • 这也没有用...@Bonana
  • 即使@David Maze 建议的语法更改,添加引号: [ "/home/server/start.sh" ] ?
【解决方案2】:

一般来说,每个容器应该只运行一个进程。如果您需要运行五个单独的进程,您通常会运行五个单独的容器。

由此产生的推论是主容器命令应该是前台进程;而且你可以使用不同的命令从同一个镜像中运行多个容器。在 Compose 中,您可以为每个容器分别覆盖 command:。因此,例如,您可以指定:

version: '3.8'
services:
  main:
    image: deviceserver:latest
    command: ./main.py
  socket:
    image: deviceserver:latest
    command: ./main_socket.py
  et: cetera

如果您尝试复制并粘贴这个确切的 docker-compose.yml 文件,请确保在 Dockerfile 中设置 WORKDIR 以便脚本位于当前目录中,确保脚本是可执行的(@ 987654325@ 在您的源存储库中),并确保它们以“shebang”行 #!/usr/bin/env python3 开头。您无需在任何地方明确说出python

FROM python:3.9       # not a bare Ubuntu image
WORKDIR /home/server  # creates the directory too
COPY server ./        # don't need to duplicate the directory name here
RUN pip install -r requirements.txt
EXPOSE 8854           # optional, does almost nothing
CMD ["./main.py"]     # valid JSON-array syntax; can be overridden

您显示的设置中有两个主要问题。 CMD 不是语法上有效的 JSON 数组(命令本身不是 "quoted"),因此 Docker 会将其作为 shell 命令运行; [test(1) 的别名,将立即退出。如果您成功运行脚本,脚本会启动一堆后台进程然后退出,但由于脚本是主容器命令,这也会导致容器退出。运行一组单进程容器通常比尝试将多个进程压缩到一个容器中更容易管理和扩展。

【讨论】:

    【解决方案3】:

    您可以在 start.sh 末尾添加 sleep 命令。

    #!/bin/sh
    python source/server/main.pyc &
    python source/server/main_socket.pyc &
    python source/server/main_monitor_server.pyc &
    python source/server/main_status_server.pyc &
    python source/server/main_events_server.pyc &
    while true
    do
      sleep 1;
    done
    

    【讨论】:

    • 试过了,没用,很遗憾。
    猜你喜欢
    • 2020-08-16
    • 2022-01-27
    • 2015-10-17
    • 2019-05-30
    • 2021-08-22
    • 1970-01-01
    • 2016-09-30
    • 2019-07-26
    • 2016-10-05
    相关资源
    最近更新 更多