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
相关产品推荐
相关产品推荐

