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中添加:
或在docker-compose.yml的对应service中配置:ENV FLASK_APP=wsgi:appenvironment: - 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
相关产品推荐
相关产品推荐

