如何通过Python Docker SDK维持Docker容器后台运行?Flask连接异常解决
Let's break down what's going wrong here and fix it step by step:
1. Port Mismatch (The Biggest Culprit)
Your Flask app is configured to run on port 5000 (either via the default PORT fallback in your code, since you didn't set an environment variable when starting the container). But in your Docker run code, you're mapping container port 1000/tcp to host port 1000—this doesn't line up with where your Flask app is actually listening.
Fix the port mapping in your Python code to target the correct container port:
# Map container's 5000 port to host's 1000 port client.containers.run(IMAGE_NAME, detach=True, ports={"5000/tcp": "1000"})
2. Race Condition: Requesting Before the App is Ready
When you call containers.run() with detach=True, Docker starts the container in the background—but your Flask app still needs a few seconds to fully initialize and start listening for requests. Immediately sending a requests.get() will almost always fail because the service isn't ready yet.
Add a short delay before making the request:
import time # ... after starting the container time.sleep(5) # Give the Flask app time to boot up res = requests.get("http://localhost:1000/health")
3. Verify the Container is Actually Running
If the container is stopping immediately, you need to dig into why. Capture the container object when you start it, then inspect its status and logs to debug:
container = client.containers.run(IMAGE_NAME, detach=True, ports={"5000/tcp": "1000"}) print(f"Container status: {container.status}") # If it's not running, print logs to find the issue if container.status != "running": print("Container logs:") print(container.logs().decode("utf-8"))
Common reasons the container might stop abruptly:
- Missing dependencies: Ensure
requirements.txtexplicitly includesFlask(your app depends on it, so this is critical). - Typo in the Dockerfile
CMD: Double-check thatapp.pyis the correct entrypoint file for your Flask app. - Code errors in
app.py: The logs will show any runtime crashes that cause the app (and container) to exit.
Full Corrected Python Code
Putting all these fixes together:
import docker import requests import time client = docker.from_env() IMAGE_NAME = "your-image-name-here" # Don't forget to replace this with your actual image name! if __name__ == "__main__": # Start container with correct port mapping container = client.containers.run(IMAGE_NAME, detach=True, ports={"5000/tcp": "1000"}) # Wait for the Flask app to finish initializing time.sleep(5) try: res = requests.get("http://localhost:1000/health") print(f"Response status code: {res.status_code}") print(f"Response content: {res.text}") except requests.exceptions.ConnectionError as e: print(f"Failed to connect: {e}") print("\nDebug info:") print(f"Container status: {container.status}") print("Container logs:") print(container.logs().decode("utf-8"))
Bonus: Ensuring the Container Stays Running
Your Dockerfile is already set up correctly to keep the container running: the CMD ["python", "app.py"] runs the Flask app in the foreground. As long as the Flask app doesn't crash (fix any code errors or missing dependencies), the container will stay running in the background. The main issues here were the port mismatch and premature request.
内容的提问来源于stack exchange,提问作者nz_21

