gpt4 book ai didi

python - "coverage run app.py"在 docker 容器内未创建 .coverage 文件?

转载 作者:太空宇宙 更新时间:2023-11-04 02:32:58 25 4
gpt4 key购买 nike

系统定义:

2012 macbook pro 运行 Sierra,
Docker 版本:17.12.0-ce-mac49 (21995)

问题:

我在容器中使用“覆盖运行”运行我的 python 应用程序时遇到问题。我将尝试在下面解释我在做什么......希望它是有道理的。试图把尽可能多的信息放在我正在尝试做的事情和我已经在这里做的事情上。

基本上我的情况是这样的。我正在启动一个基于 python 的(金字塔)网络服务。它只是一个基于 HTTP 的 API。没有什么 super 花哨的。当我对它运行 postman 测试时,我想获得它的覆盖率,所以我通过执行“coverage run/path/path/path/app.py”来启动它,并且效果很好。我在要分析的源代码上创建了一个 .coveragerc,将其归零,一切都很好,在容器之外。试图在我的这个应用程序的容器化版本中进行覆盖是另一回事。

供引用..这是我的 Dockerfile,其中包含######### 标记的 secret 内容

FROM ################:latest

# Add files
ADD . / /path/

# Set up Env
ENV GRAPHITE_SERVER=localhost
ENV APP_USER=root
ENV APP_HOME=/path
ENV APP_LOGS=$APP_HOME/logs
ENV PYTHONPATH=#################:$PYTHONPATH
ARG requested_environment=stage1
ARG coverage
ARG log_monitor
ENV COVERAGE=$coverage
ENV LOG_MONITOR=$log_monitor
ENV ENVIRONMENT=$requested_environment
ENV PATH=$APP_HOME/######:$PATH

RUN mkdir -p $APP_LOGS
RUN pip install -r $APP_HOME/requirements.txt
RUN cd $APP_HOME/external-libs/mysql-connector/mysql-connector-python-2.1.2/; python setup.py install

RUN ln -fs /usr/bin/python /usr/local/bin/python

EXPOSE 1234

# start app
ENTRYPOINT $COVERAGE $APP_HOME/path/path/app.py $LOG_MONITOR

我的构建命令是
docker build . --build-arg requested_environment=stage1 --build-arg log_monitor=noMonitor --build-arg coverage="coverage run" -t stage1-latest
我想在容器内做同样的事情,就像我可以在容器外做一样......意思是......我想在容器内运行应用程序并覆盖。所以你会认为它就像正常构建容器一样简单,入口点通常是
ENTRYPOINT /path/path/path/app.py
changed to
ENTRYPOINT coverage run /path/path/path/app.py

但显然不是。

如果我使用启动应用程序的 ENTRYPOINT 或 CMD 构建容器.. 像这些.. 是的,我已经尝试了所有..
ENTRYPOINT coverage run /path/path/path/app.py
ENTRYPOINT bash -c "coverage run /path/path/path/app.py"
ENTRYPOINT ["bash' "-c","coverage run /path/path/path/app.py"]
ENTRYPOINT ["coverage","run","/path/path/path/app.py"]
CMD coverage run /path/path/path/app.py
CMD ["bash' "-c","coverage run /path/path/path/app.py"]
or
CMD ["coverage","run","/path/path/path/app.py"]

然后像这样启动容器
docker run --name stage1-latest-container-instance -itp 1234:1234 stage1-latest
甚至在 dockerfile 中的 CMD 条目的情况下也是如此(因为它们是默认的,我用这个命令覆盖它们)
docker run --name stage1-latest-container-instance -itp 1234:1234 stage1-latest coverage run /path/path/path/app.py
我的应用程序启动得很好..没问题..但是

没有创建 .coverage 文件!我在容器的文件系统中没有看到 .coverage 文件。

好的..尝试差异方法

将 dockerfile 更改为
ENTRYPOINT bash
or
CMD bash

重建它...

然后运行容器 docker run --name stage1-latest-container-instance -itp 1234:1234 stage1-latest
这给了我在 docker 容器中的提示。
[root@ac25fb69bb2e /]#
然后从另一个窗口执行此操作
docker exec -it stage1-latest-container-instance coverage run /path/path/path/app.py
或其他方法来做这个 docker exec
docker exec -it stage1-latest-container-instance bash -c "coverage run /path/path/path/app.py"
仍然!没有 .coverage 文件被创建。

好的..采用差异方法
我什至创建了一个名为 runapp.sh 的文件并将以下行放入其中
#!/bin/bash
cd /path/path/path && coverage run app.py

然后启动容器
docker run --name stage1-latest-container-instance -itp 1234:1234 stage1-latest /path/runapp.sh
没有 .coverage 文件
然后我尝试运行容器
docker run --name stage1-latest-container-instance -itp 1234:1234 stage1-latest bash
然后从另一个窗口做
docker exec -it stage1-latest-container-instance /path/runapp.sh
仍然没有 .container 文件

好吧。。最后的办法。。

进入我在交互模式(-it)的dockerfile中运行“docker run”后得到的提示(-it)..并手动启动我的应用程序。
[root@ac25fb69bb2e /]# coverage run /path/path/path/app.py
令人惊讶的是.. .coverage 文件的创建没有问题....

有没有搞错!
我无法弄清楚这一点..我不知道发生了什么...但是从容器外部对容器执行的命令与在内部的单个外壳内手动执行的命令之间似乎完全断开了容器是否可以创建文件。

有人请告诉我我在这里做错了什么。

我能看到的唯一下一步是在我的应用程序本身中使用覆盖模块,并为 KeyboardInterrupt 添加一个异常处理程序,以在应用程序被终止时保存覆盖数据。但这很糟糕。

最佳答案

对于像我一样从谷歌跌跌撞撞的人......

为了扩展 Wolfium 的答案,这是由于 docker 在覆盖将数据写入其数据文件之前杀死了 python 进程(或者更正确地说,python 无法优雅地解释 docker 的默认 SIGTERM 信号并且当它得到一个SIGKILL 几秒钟后)。解决此问题的最快方法是:

  • 确保 python 进程能够接收到相关信号。如果您在 shell 入口点脚本中运行它,您可能需要在前面加上 exec ,例如exec coverage -m swagger_server .
  • 图像的停止信号默认为 SIGINT ,大多数 python 处理程序都实现:添加行 STOPSIGNAL SIGINT到你的 Dockerfile。

  • 稍微好一点的解决方案是确保您的 python 处理程序可以响应 SIGTERM适本地。

    关于python - "coverage run app.py"在 docker 容器内未创建 .coverage 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48692363/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com