执行代码后停止 Docker 容器
Stop a Docker container after executing code
为了更深入地了解 Docker,我创建了一个执行 python 脚本的 dockerfile。它工作正常,但在执行脚本后容器崩溃了。如何修改我的 dockerfile 以便在执行后销毁容器而不是让容器一直崩溃并重新启动?
Docker文件:
FROM python:3
ADD aa.py /
CMD [ "python", "./aa.py" ]
Python:
print('Hello!')
错误信息:
2017-06-14 11:37:09 [CELL/0] OUT Starting health monitoring of container
2017-06-14 11:37:09 [APP/PROC/WEB/0] OUT Hello!
2017-06-14 11:37:09 [APP/PROC/WEB/0] OUT Exit status 0
2017-06-14 11:37:09 [CELL/0] OUT Exit status 143
2017-06-14 11:37:09 [CELL/0] OUT Destroying container
2017-06-14 11:37:09 [API/0] OUT Process has crashed with type: "web"
2017-06-14 11:37:09 [API/0] OUT App instance exited with guid 6fdede46-6751-4725-ad78-b76262dbe701 payload: {"instance"=>"", "index"=>0, "reason"=>"CRASHED", "exit_description"=>"2 error(s) occurred:\n\n* 2 error(s) occurred:\n\n* Codependent step exited\n* cancelled\n* cancelled", "crash_count"=>4, "crash_timestamp"=>1497433029411246770, "version"=>"98e2a035-e38f-4169-95fb-2701c8486e9c"}
2017-06-14 11:37:09 [CELL/0] OUT Successfully destroyed container
2017-06-14 11:38:31 [CELL/0] OUT Creating container
注:默认CMD
for python:3
is python3
.
exit code 143 means SIGTERM
as mentioned here. That is what docker sends.
所以你需要 python3 application to process SIGTERM signal gracefully
不要忘记,您的 python 应用一旦完成并退出主要功能,就会导致容器自动停止并退出。
The OP adds :
In the meantime, I have found out that handling the SIGTERM
in the Docker environment works perfectly fine.
However using the same code in Docker on CloudFoundry does not prevent the container from crashing.
In CloudFoundry you need an application that is always running and not just doing a task and then stopping like a script does.
Even stopping without errors is detected as a crash in CloudFoundry.
I transformed my script into a REST server by using the flask framework. Now it is always running but only doing its task when being called via its url.
为了更深入地了解 Docker,我创建了一个执行 python 脚本的 dockerfile。它工作正常,但在执行脚本后容器崩溃了。如何修改我的 dockerfile 以便在执行后销毁容器而不是让容器一直崩溃并重新启动?
Docker文件:
FROM python:3
ADD aa.py /
CMD [ "python", "./aa.py" ]
Python:
print('Hello!')
错误信息:
2017-06-14 11:37:09 [CELL/0] OUT Starting health monitoring of container
2017-06-14 11:37:09 [APP/PROC/WEB/0] OUT Hello!
2017-06-14 11:37:09 [APP/PROC/WEB/0] OUT Exit status 0
2017-06-14 11:37:09 [CELL/0] OUT Exit status 143
2017-06-14 11:37:09 [CELL/0] OUT Destroying container
2017-06-14 11:37:09 [API/0] OUT Process has crashed with type: "web"
2017-06-14 11:37:09 [API/0] OUT App instance exited with guid 6fdede46-6751-4725-ad78-b76262dbe701 payload: {"instance"=>"", "index"=>0, "reason"=>"CRASHED", "exit_description"=>"2 error(s) occurred:\n\n* 2 error(s) occurred:\n\n* Codependent step exited\n* cancelled\n* cancelled", "crash_count"=>4, "crash_timestamp"=>1497433029411246770, "version"=>"98e2a035-e38f-4169-95fb-2701c8486e9c"}
2017-06-14 11:37:09 [CELL/0] OUT Successfully destroyed container
2017-06-14 11:38:31 [CELL/0] OUT Creating container
注:默认CMD
for python:3
is python3
.
exit code 143 means SIGTERM
as mentioned here. That is what docker sends.
所以你需要 python3 application to process SIGTERM signal gracefully
不要忘记,您的 python 应用一旦完成并退出主要功能,就会导致容器自动停止并退出。
The OP adds
In the meantime, I have found out that handling the
SIGTERM
in the Docker environment works perfectly fine.However using the same code in Docker on CloudFoundry does not prevent the container from crashing.
In CloudFoundry you need an application that is always running and not just doing a task and then stopping like a script does.
Even stopping without errors is detected as a crash in CloudFoundry.I transformed my script into a REST server by using the flask framework. Now it is always running but only doing its task when being called via its url.