【问题标题】:docker-compose running container with command but command only works manually in containerdocker-compose 使用命令运行容器,但命令只能在容器中手动工作
【发布时间】:2021-08-03 18:25:59
【问题描述】:

我有一个 docker-compose 文件,其中包含如下配置的服务:

py_publisher:
    build:
        context: ./client
        dockerfile: Dockerfile
    deploy:
        mode: replicated
        replicas: 3
#    entrypoint: "python3 mqtt_client.py" 

镜像是从这个 Dockerfile 构建的:

# syntax=docker/dockerfile:1
FROM python:3.8-slim-buster
WORKDIR /mqtt_client
COPY . .
RUN pip3 install -r requirements.txt
CMD ["python3", "mqtt_client.py"]

容器的主目录(/mqtt_client)包含:

Dockerfile  mqtt_client.py  requirements.txt

相关的docker-compose结果:

CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS                        PORTS                                                                                            NAMES
61b8f5e1e0bb   e1d0fc27a640   "python3 mqtt_client…"   7 seconds ago   Up 2 seconds                                                                                                                   mqtt-demo_py_publisher_1
9992b9c9031d   e1d0fc27a640   "python3 mqtt_client…"   7 seconds ago   Up 3 seconds                                                                                                                   mqtt-demo_py_publisher_2
a197f0f3126b   e1d0fc27a640   "python3 mqtt_client…"   7 seconds ago   Up 2 seconds                                                                                                                   mqtt-demo_py_publisher_3

问题在于 Python 命令实际上并没有“工作”。根本没有任何反应。但是,当我 exec 进入容器并运行该命令时,它工作正常。

我通过 docker-compose 运行和手动执行到容器中的方式有​​什么区别?

【问题讨论】:

  • 容器已“启动”并且命令按预期显示,所以您的应用在启动时不会记录任何内容吗?
  • @OneCricketeer 不,该应用程序没有记录任何内容,但我知道它不起作用,因为我可以检查 Python 脚本在另一个应用程序中执行的操作的结果。当我在exec'ed 时手动运行它时,它工作正常。
  • python -u 选项或PYTHONUNBUFFERED 环境变量是否有所不同;进程是否实际运行,但在进程中缓冲其输出? (例如参见Python app does not print anything when running detached in docker。)
  • 我是说你能在客户端脚本的主要方法中记录/打印任何东西吗?容器是否真的保持原状,而不是重新启动自己?如果docker-compose logs 为空,则似乎命令正在退出并出现错误
  • @DavidMaze no 我已经确认缺少输出是因为脚本根本没有运行。

标签: python python-3.x docker docker-compose dockerfile


【解决方案1】:

正确的方法是使用入口点和命令。例如

ENTRYPOINT ["python3"]
CMD ["mqtt_client.py"]

由于您已经在使用 python 图像,您可以删除 ENTRYPOINT 指令,只保留 CMD

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2020-06-24
    相关资源
    最近更新 更多