【发布时间】: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)。
【问题讨论】: