如果是 Docker 容器不要在 Dockerfile 里面做开机自启,Docker 的标准做法是使用 --restart 策略。

推荐方案(★★★★★)

Dockerfile

建议把 CMD 改成下面这样,不要使用 nohup

FROM python:3.10-slim

WORKDIR /opt/jyd01/wangruihua/jyd_tts

COPY requirements.txt .

RUN pip install --no-cache-dir \
    -i https://pypi.tuna.tsinghua.edu.cn/simple \
    -r requirements.txt

COPY . .

RUN mkdir -p logs

EXPOSE 8010

CMD ["bash", "-c", "python tts_flask.py 2>&1 | tee logs/8010.log"]

原因:

  • Python 是主进程(PID1)
  • Python 崩溃,Docker 能检测到
  • docker logs 可以查看日志
  • 日志同时保存到 logs/8010.log

构建镜像

docker build -t jyd_tts:v1.0 .

导出镜像(用于部署)

docker save -o jyd_tts_v1.0.tar jyd_tts:v1.0

新服务器导入:

docker load -i jyd_tts_v1.0.tar

启动容器(设置自动启动)

docker run -d \
  --name jyd_tts_container \
  -p 8010:8010 \
  --restart always \
  jyd_tts:v1.0

如果需要挂载宿主机目录:

docker run -d \
  --name jyd_tts_container \
  -p 8010:8010 \
  --restart always \
  -v /opt/jyd01/wangruihua/api_docker/jyd_tts:/opt/jyd01/wangruihua/jyd_tts \
  jyd_tts:v1.0

其中:

--restart always

表示:

  • 服务器重启后自动启动
  • Docker 服务重启后自动启动
  • 容器异常退出自动重启

如果容器已经存在

直接修改重启策略即可:

docker update --restart=always jyd_tts_container

查看是否生效:

docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' jyd_tts

应该输出:

always

取消重启测策略:

# 先停掉自动重启,避免一直刷
docker update --restart=no jyd_tts_container

# 停止容器
docker stop jyd_tts_container

# 查看退出原因和日志
docker logs --tail=200 jyd_tts_container


查看容器状态

docker ps

应该看到

STATUS
Up 3 minutes

查看日志

实时查看

docker logs -f jyd_tts_container

或者

cat logs/8010.log

如果你的服务器没有开启 Docker 自启动

还需要执行一次:

sudo systemctl enable docker
sudo systemctl start docker

验证:

systemctl status docker

只要 Docker 服务开机启动,并且容器设置了 --restart always,那么 服务器重启后,tts_flask.py 会自动启动,无需额外写 systemd 服务。这是 Docker 官方推荐的部署方式。

更多推荐