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

GitHub Action部署时忽略Docker容器Entrypoint的问题排查与建议

问题描述

开发Flask应用并搭建GitHub流水线,Dockerfile配置了Entrypoint用于执行数据库升级命令并启动gunicorn服务。本地运行逻辑完全正常,但通过GitHub Action部署时,Entrypoint中的命令未执行。相关配置如下:

Dockerfile

FROM python:3.10-slim

WORKDIR /opt/app

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN pip install --upgrade pip
COPY ./requirements.txt /opt/app/requirements.txt
RUN chmod +x /opt/app/requirements.txt
RUN pip install -r requirements.txt

COPY . /opt/app/
RUN chmod +x /opt/app/docker-entrypoint.sh
ENTRYPOINT [ "/opt/app/docker-entrypoint.sh" ]

Docker Entrypoint脚本

#! /bin/sh
echo "*********Upgrading database************"
flask db upgrade
echo "**************Starting gunicorn server***************"
gunicorn --bind 0.0.0.0:5000 wsgi:app
echo "************* started gunicorn server****************"

GitHub Action配置

name: CI

on:
  push:
    branches: [master]

jobs:
  build_and_push:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout files
        uses: actions/checkout@v2
  
  deploy:
    needs: build_and_push
    runs-on: ubuntu-latest

    steps:
    - name: Checkout files
      uses: actions/checkout@v2
        
    - name: Deploy to Digital Ocean droplet via SSH action
      uses: appleboy/ssh-action@v0.1.3
      with:
        host: ${{ secrets.HOST }}
        username: ${{ secrets.USERNAME }}
        key: ${{ secrets.SSH_PRIVATE_KEY }}
        port: 22
         
    - name: Start containers
      run: docker-compose up -d --build
      
    - name: Check running containers
      run: docker ps
排查与优化方案

1. 修复GitHub Action的SSH执行逻辑

当前配置中,Start containers和Check running containers步骤是在GitHub Action的runner机器上执行,而非目标Digital Ocean droplet。appleboy/ssh-action仅建立连接,后续命令未通过SSH在服务器内运行。

修复方法:将容器启动命令整合到SSH动作的script参数中,确保命令在目标服务器执行:

- name: Deploy to Digital Ocean droplet via SSH action
  uses: appleboy/ssh-action@v0.1.3
  with:
    host: ${{ secrets.HOST }}
    username: ${{ secrets.USERNAME }}
    key: ${{ secrets.SSH_PRIVATE_KEY }}
    port: 22
    script: |
      cd /path/to/your/project  # 替换为droplet中项目代码的实际路径
      docker-compose up -d --build
      docker ps

同时删除原有的Start containers和Check running containers步骤。

2. 完善Entrypoint脚本与环境配置

  • 补充Flask环境变量:Flask命令需要FLASK_APP等变量才能正常运行,可在Dockerfile中添加:
    ENV FLASK_APP=wsgi:app
    
    或在docker-compose.yml的对应service中配置:
    environment:
      - FLASK_APP=wsgi:app
    
  • 添加错误终止机制:在脚本开头加入set -e,遇到错误立即退出,避免命令失败后继续执行:
    #! /bin/sh
    set -e
    echo "*********Upgrading database************"
    flask db upgrade
    echo "**************Starting gunicorn server***************"
    gunicorn --bind 0.0.0.0:5000 wsgi:app
    
  • 验证脚本权限:虽然Dockerfile已设置chmod +x,可在容器启动后进入容器确认脚本权限:
    docker exec -it <container-name> ls -l /opt/app/docker-entrypoint.sh
    

3. 检查Docker Compose配置

确保docker-compose.yml中未覆盖Entrypoint。如果service中指定了command,会作为Entrypoint的参数执行,可能干扰原有逻辑。若无需自定义命令,删除command配置项。

4. 日志排查

部署后通过容器日志定位问题:

# 查看容器运行日志
docker logs <container-name>
# 进入容器调试脚本执行情况
docker exec -it <container-name> /bin/sh

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:50:29