Docker Attach与Exec差异:WebSocket调用Docker API的容器连接问题
Great question! Let's break this down step by step to address your two key concerns: using docker attach interactively while your script runs, and the lack of WebSocket support for docker exec.
Can you use docker attach while running your script?
Short answer: Yes, but you need to adjust your container's startup command—here's why and how:
docker attach connects directly to the container's PID 1 process (the main process you defined in your Dockerfile or docker run command). Right now, that's /tools/script.sh, which runs in the foreground. Since it's not an interactive shell, you only see its output and can't send commands to a Linux environment.
Fix 1: Wrap your script in an interactive shell
Modify your container's startup command to launch the script in the background, then keep an interactive bash session as the main process. For example:
bash -c "/tools/script.sh & exec bash"
- The
&runs your script in the background exec bashreplaces the temporary shell with an interactive bash (which becomes PID 1), sodocker attachconnects directly to this shell- You'll get a fully interactive Linux environment while your script runs in the background
Fix 2: Use a dedicated startup script
Create a /tools/start.sh script with executable permissions (chmod +x /tools/start.sh):
#!/bin/bash # Start your script in the background /tools/script.sh & # Launch interactive bash as the main process exec bash
Set this as your container's startup command. Now docker attach will drop you into a bash session, and your original script keeps running.
Bonus: Handle PID 1 properly (avoid zombie processes)
If your script spawns child processes, consider using an init system like tini to manage them. Add tini to your container (via apt install tini or include it in your Dockerfile) and adjust the startup command:
tini -- bash -c "/tools/script.sh & exec bash"
This ensures orphaned child processes are cleaned up correctly.
WebSocket support for container access
You're right that:
- The Docker API's WebSocket endpoint works seamlessly with
docker attach—you just need to include the right parameters (stdin=1,stdout=1,stderr=1,stream=1) and set up the WebSocket upgrade headers in your request. docker execcurrently has no official WebSocket implementation. The exec API uses HTTP streaming (chunked encoding for HTTP/1.1 or HTTP/2 streams) instead of standard WebSockets, so you can't use the same WebSocket approach here.
Final Recommendation
If you need WebSocket-based access to an interactive shell while your script runs, go with the adjusted startup command approach above. This lets you use the Docker API's WebSocket attach endpoint to get both script logs (you can still view them via tail -f /path/to/script.log if your script writes to a log file) and interactive shell access.
内容的提问来源于stack exchange,提问作者user9565299

