当任何文件发生更改时,在 Docker 容器中重新启动 Python 脚本

Posted

技术标签:

【中文标题】当任何文件发生更改时,在 Docker 容器中重新启动 Python 脚本【英文标题】:Restart Python script inside Docker container when any file has changes 【发布时间】:2020-12-26 06:51:46 【问题描述】:

我有一个简单的脚本,比如

print('hey 01')

我已将其 dockerized 如下所示:

FROM python:3.8

WORKDIR /crawler_app

COPY requirements.txt .

RUN pip install -r requirements.txt

COPY . .

CMD ["python", "-u", "boot_up.py"]

我还有一个如下的撰写文件:

version: "3.7"

services:
  db:
    image: mongo:latest
    container_name: $DB_CONTAINER_NAME
    volumes:
      - ./mongo-volume:/data/db
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: $MONGO_USER
      MONGO_INITDB_ROOT_PASSWORD: $MONGO_USER_PASS
    ports:
      - $EXPOSED_PORT:27017
    networks:
      - crawl-network

  crawler:
    build: crawler
    container_name: $CRAWLER_APP_NAME
    restart: always
    volumes:
      - ./crawler:/crawler_app
    networks:
      - crawl-network
    depends_on:
      - db

networks:
  crawl-network:

问题

问题是,虽然我的 Docker 容器中有一个卷,并且当我在编辑器中更改代码并保存它时,容器内的源代码会更新,但无法重新启动 Python 脚本以开始新的更新代码。

我已经搜索了很多关于这个问题的内容,我在 GitHub 和 Stack Overflow 上找到了一些线程,但没有一个对我没有用,我也没有得到他们的答案。

我的主要问题是,如何在更改源代码并保存时重新启动容器内的 Python 脚本?

我找到了一种方法,每次都提到要重启你的容器,但我认为应该有一个简单的方法,比如 nodemon 到 javascript

【问题讨论】:

这能回答你的问题吗? How do i watch python source code files and restart when i save?. 我已经读到,当我遇到问题时,它有点帮助,但它不是正确的方式,因为我想用 python 方式,而不是用 nodemon 的 js 方式!,我想要我的容器没有任何额外的东西,比如 npm 能够运行npm install nodemon,我想要它在纯 python 中! 第三个答案使用来自 pip 的watchdog 我在我的 Docker 文件 CMD ["watchmedo", "shell-command", "--patterns='*.py'", "--command='python -u \"boot_up.py\"'", "."] 中使用了这个命令,它给了我这个错误 Traceback (most recent call last): File "/usr/local/bin/watchmedo", line 5, in <module> from watchdog.watchmedo import main File "/usr/local/lib/python3.8/site-packages/watchdog/watchmedo.py", line 27, in <module> import yaml ModuleNotFoundError: No module named 'yaml' 实际上,我认为您需要pip install watchdog[watchmedo] 才能获得额外的部门。 【参考方案1】:

如果你想使用 watchmedo,你需要安装库来通过命令解析 yaml 文件 python -m pip install pyyaml

【讨论】:

以上是关于当任何文件发生更改时,在 Docker 容器中重新启动 Python 脚本的主要内容,如果未能解决你的问题,请参考以下文章

Postgres 和 Docker 在文件更改时重新部署

当 docker 容器内的数据发生变化时,Create-react-app 服务器不会重新编译

在主机上更改挂载卷中的文件时,不会在 docker 容器中触发文件系统事件

docker-compose未显示对代码的任何更改

docker--镜像操作

docker volume