GitHub Action推送Flask应用至Docker Hub失败及容器访问异常
问题根因分析
当前异常由三类配置错误叠加导致,仅在容器化/CI场景触发:
- Dockerfile配置本地与仓库版本不一致:你提供的本地Dockerfile基于Ubuntu镜像、暴露8777端口、调用python3启动,但GitHub Action构建日志显示仓库内实际Dockerfile基于python:3.8镜像、暴露5000端口、调用python启动,两边配置完全不统一。
- 启动逻辑与服务绑定配置错误:
CMD ["python3", "./simpleflask.py", "./main.py"]写法只会执行第一个脚本simpleflask.py,传入的main.py仅作为命令行参数不会被执行;同时Flask默认绑定127.0.0.1回环地址,容器内的回环地址对宿主机、外部网络完全不可见,这是本地启动容器后访问提示站点不可达的核心原因。 - GitHub Action工作流逻辑错误:构建完镜像后未启动Docker容器,直接在Action运行机宿主机上执行
python ./main.py请求127.0.0.1:5000的服务,此时宿主机没有运行任何对应服务,必然触发连接拒绝;另外镜像打标签命令不完整、Secrets引用格式错误,即便前面步骤执行成功也无法完成镜像推送。
修复方案
1. 统一修正Dockerfile配置
直接使用官方Python基础镜像减少环境依赖问题,统一路径、端口、启动配置,替换Dockerfile内容如下:
# 使用官方轻量Python基础镜像 FROM python:3.8-slim # 工作目录使用绝对路径,避免相对路径解析异常 WORKDIR /app # 优先复制依赖文件,复用Docker构建缓存 COPY requirements.txt . RUN pip install --no-cache-dir --upgrade pip && \ pip install --no-cache-dir -r requirements.txt # 复制剩余项目代码 COPY . . # 暴露端口与Flask实际监听端口保持一致 EXPOSE 8777 # 启动命令仅启动Flask服务,强制绑定0.0.0.0允许外部访问 CMD ["python3", "simpleflask.py"]
额外检查:确认simpleflask.py中app.run()配置为app.run(host="0.0.0.0", port=8777),禁止使用默认的127.0.0.1绑定地址。
2. 本地容器启动验证
本地构建启动时必须显式做端口映射,执行命令如下:
# 构建镜像 docker build -t flask-app . # 启动容器,将容器内8777端口映射到宿主机8777端口 docker run -d -p 8777:8777 --name flask-test flask-app
启动后访问http://localhost:8777即可正常访问服务,不会再出现站点不可达提示。
3. 修正GitHub Action工作流配置
替换.github/workflows/main.yml内容,修正执行逻辑、镜像推送语法、Secrets引用格式:
name: CI on: push: branches: [ "master" ] pull_request: branches: [ "master" ] workflow_dispatch: jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Build docker image run: docker build -t dockerized-flask . - name: Start container and verify service run: | # 启动测试容器并映射端口 docker run -d -p 8777:8777 --name test-flask dockerized-flask # 等待服务启动就绪 sleep 5 # 验证服务可正常响应 curl -f http://localhost:8777 || exit 1 # 测试完成停止并删除测试容器 docker rm -f test-flask - name: Login to Docker Hub uses: docker/login-action@v2 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Push image to Docker Hub run: | docker tag dockerized-flask ${{ secrets.DOCKER_USERNAME }}/dockerized-flask:latest docker push ${{ secrets.DOCKER_USERNAME }}/dockerized-flask:latest
配置说明:需要在GitHub仓库Secrets中单独添加两个配置项:DOCKER_USERNAME存储Docker Hub用户名,DOCKER_PASSWORD存储Docker Hub访问令牌,原配置中嵌套式的Secrets引用写法不被GitHub Actions支持。
内容的提问来源于stack exchange,提问作者user19215134
相关产品推荐
相关产品推荐

