【问题标题】:Python process never exits in Docker container during CircleCI workflow在 CircleCI 工作流程中,Python 进程永远不会在 Docker 容器中退出
【发布时间】:2021-03-17 10:38:46
【问题描述】:

我有一个Dockerfile,看起来像这样:

FROM python:3.6

WORKDIR /app
ADD . /app/

# Install system requirements
RUN apt-get update && \
    xargs -a requirements_apt.txt apt-get install -y

# Install Python requirements
RUN python -m pip install --upgrade pip
RUN python -m pip install -r requirements_pip.txt

# Circle CI ignores entrypoints by default
ENTRYPOINT ["dostuff"]

我有一个 CircleCI 配置:

version: 2.1


orbs:
  aws-ecr: circleci/aws-ecr@6.15.3


jobs:
  benchmark_tests_dev:
    docker:
      - image: blah_blah_image:test_dev
        #auth
    steps:
      - checkout
      - run:
          name: Compile and run benchmarks
          command: make bench

workflows:
  workflow_test_and_deploy_dev:
    jobs:
      - aws-ecr/build-and-push-image:
          name: build_test_dev
          context: my_context
          account-url: AWS_ECR_ACCOUNT_URL
          region: AWS_REGION
          repo: my_repo
          aws-access-key-id: AWS_ACCESS_KEY_ID
          aws-secret-access-key: AWS_SECRET_ACCESS_KEY
          dockerfile: Dockerfile
          tag: test_dev
          filters:
            branches:
              only: my-test-branch
      - benchmark_tests_dev:
          requires: [build_test_dev]
          context: my_context
          filters:
            branches:
              only: my-test-branch
      - aws-ecr/build-and-push-image:
          name: deploy_dev
          requires: [benchmark_tests_dev]
          context: my_context
          account-url: AWS_ECR_ACCOUNT_URL
          region: AWS_REGION
          repo: my_repo
          aws-access-key-id: AWS_ACCESS_KEY_ID
          aws-secret-access-key: AWS_SECRET_ACCESS_KEY
          dockerfile: Dockerfile
          tag: test2
          filters:
            branches:
              only: my-test-branch

make bench 看起来像:

bench:
        python tests/benchmarks/bench_1.py
        python tests/benchmarks/bench_2.py

两个基准测试都遵循以下模式:

# imports

# define constants

# Define functions/classes

if __name__ == "__main__":
    # Run those tests

如果我在本地 my-test-branch 上构建我的 Docker 容器,覆盖入口点以进入其中,然后从容器内部运行 make bench,则两个 Python 脚本都会完美执行并退出。

如果我提交到同一个分支并触发 CircleCI 工作流,bench_1.py 会运行,然后永远不会退出。我尝试在make 命令中切换 Python 脚本的顺序。在这种情况下,bench_2.py 运行然后永远不会退出。我尝试在两个脚本的if __name__ == "__main__": 块的末尾放置一个sys.exit(),这不会强制CircleCI 退出。我要运行的第一个脚本将运行完成,因为我在整个脚本中放置了日志以跟踪进度。它永远不会退出。

知道为什么这些脚本会在本地容器中运行和退出,而不是在 CircleCI 上的容器中退出吗?

编辑

我刚刚意识到“永不退出”是我所做的假设。脚本可能退出但 CircleCI 作业在那之后静默挂起?关键是脚本运行、完成,并且 CircleCI 作业继续运行,直到我在 10 分钟时收到超时错误 (Too long with no output (exceeded 10m0s): context deadline exceeded)。

【问题讨论】:

    标签: python docker circleci


    【解决方案1】:

    原来我们使用的snowflake.connector Python 库有this 问题,如果在打开的雪花连接期间发生错误,则连接没有正确关闭并且进程挂起。还有另一个issue,该库中的某些错误被记录但未引发,导致第一个问题静默发生。

    我更新了我们的雪花 IO 处理程序,以显式打开/关闭每次读取/执行的连接,这样就不会发生这种情况。现在我的脚本在 CircleCI 的容器中运行得很好。我仍然不知道为什么它们在本地而不是远程运行在容器中,但我将把那个留给开发运营之神。

    【讨论】:

      猜你喜欢
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-21
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多