You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub Actions部署Docker容器时Streamlit未找到的问题求助

Docker容器启动失败:streamlit可执行文件不在PATH中(GitHub Actions部署问题)

本地构建Docker镜像完全正常,但通过GitHub Actions部署到EC2自托管 runner 时,容器启动报错:

docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "streamlit": executable file not found in $PATH: unknown.
Error: Process completed with exit code 127.

相关配置文件

Dockerfile

FROM python:3.8-slim-buster

EXPOSE 8501

RUN apt-get update && \
    apt-get install -y \
        build-essential \
        software-properties-common \
        git && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /app

COPY requirements.txt /app

RUN pip3 install -r requirements.txt

COPY . /app

CMD ["streamlit", "run", "app.py", "--server.port=8501", "--server.address=0.0.0.0"]

requirements.txt

bentoml==1.0.25
joblib==1.2.0
pip-chill==1.0.1
torchvision==0.14.1
tqdm==4.64.1
wincertstore==0.2
boto3
mypy-boto3-s3
streamlit  

GitHub Actions工作流文件(main.yaml)

name: workflow
on:
  push:
    branches:
      - main
    paths-ignore:
      - "README.md"

permissions:
  id-token: write
  contents: read

jobs:
  integration:
    name: Continuous Integration
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Code
        uses: actions/checkout@v3
        with:
          repository: Sparsha1303/Deep-Learning
          token: ${{ secrets.GITHUB_TOKEN }}
          ref: main

      - name: Lint code
        run: echo "Linting repository"

      - name: Run unit tests
        run: echo "Running unit tests"

  push_to_registry:
    name: Push Docker image to Docker hub
    runs-on: ubuntu-latest
    steps:
      - name: Checkout out the repo
        uses: actions/checkout@v3
  
      - name: Setup Docker Build
        uses: docker/setup-buildx-action@v2

      - name: Login to docker hub
        uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
        with:
          username: ${{secrets.DOCKER_USERNAME}}
          password: ${{secrets.DOCKER_PASSWORD}}

      - name: Extract metadata (tags,labels) for docker
        id: meta
        uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
        with:
          images: ${{ secrets.REGISTRY }}/${{ secrets.IMAGE_NAME }}

      - name: Build and push Docker image
        uses: docker/build-push-action@v2
        with:
          context: "{{defaultContext}}"
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

  Continuous-Deployment:
    needs: push_to_registry
    runs-on: self-hosted
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ secrets.AWS_REGION }}

      - name: Log in to Docker Hub
        uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Pull images
        run: |
        
      - name: Run Docker Image to serve users
        run: |
         docker run -d -p 8501:8501 --name=stapp -e 'AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }}' -e 'AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }}' -e 'AWS_REGION=${{ secrets.AWS_REGION }}'  ${{secrets.REGISTRY}}/${{ secrets.IMAGE_NAME }}:main
      - name: Clean previous images and containers
        run: |
         docker system prune -f

问题排查与解决方案

1. 核心问题:streamlit不在系统PATH中

python:3.8-slim-buster镜像中,pip安装的可执行文件可能未被加入默认PATH,导致容器启动时找不到streamlit命令。有两种直接解决方式:

方案一:用Python模块方式启动streamlit

修改Dockerfile的CMD指令,绕过PATH依赖,直接通过Python模块调用:

CMD ["python", "-m", "streamlit", "run", "app.py", "--server.port=8501", "--server.address=0.0.0.0"]

方案二:将pip安装目录加入PATH

在Dockerfile中添加环境变量,把pip的可执行文件路径加入系统PATH:

ENV PATH="/root/.local/bin:$PATH"

2. 修复GitHub Actions部署环节的问题

  • 明确拉取最新镜像:在Pull images步骤中添加拉取命令,避免自托管runner使用缓存的旧镜像:
    - name: Pull images
      run: |
        docker pull ${{secrets.REGISTRY}}/${{ secrets.IMAGE_NAME }}:main
    
  • 调整清理与启动顺序:先清理旧容器和镜像,再启动新容器,避免刚启动的容器被误清理:
    - name: Clean previous images and containers
      run: |
        docker stop stapp || true
        docker rm stapp || true
        docker system prune -f
    - name: Run Docker Image to serve users
      run: |
       docker run -d -p 8501:8501 --name=stapp -e 'AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }}' -e 'AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }}' -e 'AWS_REGION=${{ secrets.AWS_REGION }}'  ${{secrets.REGISTRY}}/${{ secrets.IMAGE_NAME }}:main
    

3. 构建环节提前验证

在GitHub Actions的构建步骤中添加验证,确保镜像内存在streamlit,避免部署后才发现问题:

- name: Test Docker image
  run: |
    docker run --rm ${{ steps.meta.outputs.tags }} which streamlit

内容的提问来源于stack exchange,提问作者Sparsha Srinath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 18:27:09