我对Docker很陌生,特别是对Docker -compose,我遇到了一个问题,我似乎无法解决。
我有一个docker-compose.yml
文件,看起来像
version: '3.7'
services:
backup:
build:
context: .
dockerfile: Dockerfile
command: sh -c "while :;do sleep 5; done"
tty: true
stdin_open: true
volumes:
- ./data:/app/data
我有一个名为start.sh
的文件它看起来很简单,就像
python3 -u ./upload_to_s3.py > log/upload_to_s3.f9beb4d9.out 2>&1 &
当我运行docker-compose exec backup /bin/sh
时,我可以进入docker映像,我可以运行./start.sh
,它将运行我的进程,我可以通过一个简单的ps aux
来验证。但是,当我运行
时docker-compose exec backup sh start.sh
它似乎根本不运行。
我试图通过返回到图像并运行ps aux
来验证,事实上,python脚本没有运行。
怎么回事?为什么我不能用docker-compose
来运行我的start.sh
文件?
编辑:我也试着用docker-compose run --rm --detach --entrypoint="sh" backup -c "/app/start.sh"
运行这个,我得到完全相同的问题
您所展示的脚本启动了一个后台进程。但是,如果这是在docker exec
调试shell的上下文中运行,只要docker exec
命令完成,任何仍在运行的后台进程将被终止。
我可能会在一个临时容器而不是docker exec
会话中运行它。重要的是将其作为前台进程运行,而不是启动后台作业。例如:
docker-compose run backup
./upload_to_s3.py
docker-compose run
将继承backup
容器的许多设置,就像它的image:
和volumes:
挂载一样,但是您可以指定要在命令行上运行的command:
。这也为您省去了让无意义的容器存活的麻烦,以便稍后可以将docker exec
放入其中;为这些一次性任务运行一个新的容器。
(注意,我在这里展示的特定调用假设Python脚本被标记为可执行的,如果需要则使用chmod +x
;它以"shebang"开头;像#!/usr/bin/env python3
;并且图像设置了一个环境变量ENV PYTHONUNBUFFERED=1
。)