多服务Docker Compose环境下Python程序获取命令行输入的方案问询
实现Python程序在Docker Compose中获取命令行输入的方法
你的场景下不用docker-compose run也能实现交互式输入,核心是利用容器的交互式配置,再配合正确的镜像和服务设置,具体步骤如下:
1. 先修正Docker Compose的语法错误
你的Compose文件存在缩进问题(pg-admin服务和ports配置的缩进不符合YAML规范),先调整为正确格式:
services: postgres: image: postgres:13 environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres ports: - "5432:5432" pg-admin: image: dpage/pgadmin4:6 environment: - PGADMIN_DEFAULT_EMAIL=admin@email.com - PGADMIN_DEFAULT_PASSWORD=admin - PGADMIN_LISTEN_PORT=5050 ports: - "5050:5050" pythonapp: build: ./ tty: true stdin_open: true command: python3 ./main.py
2. 调整Dockerfile的命令冲突问题
当前Dockerfile里的ENTRYPOINT和Compose配置的command会冲突,导致程序执行异常,二选一调整即可:
方案A:移除Dockerfile的ENTRYPOINT
修改后的Dockerfile:
FROM python:3.8 COPY requirements.txt . RUN pip install -r requirements.txt COPY main.py ./
方案B:保留ENTRYPOINT,删除Compose的command
修改后的Dockerfile:
FROM python:3.8 COPY requirements.txt . RUN pip install -r requirements.txt COPY main.py ./ ENTRYPOINT ["python", "main.py"]
同时把Compose里pythonapp服务的command: python3 ./main.py这一行删掉。
3. 确保Python程序支持读取输入
你的main.py需要正确处理标准输入,示例代码参考:
# main.py示例 user_input = input("请输入计算参数(比如两个数用空格分隔):") nums = list(map(float, user_input.split())) if len(nums) >= 2: result = nums[0] + nums[1] print(f"计算结果:{result}") else: print("请输入至少两个数字")
4. 两种启动交互的方式
方式一:后台启动服务后,进入容器执行程序
# 启动所有服务(包括postgres、pg-admin和pythonapp) docker-compose up -d # 找到pythonapp的容器名称或ID(可以用docker ps查看) docker exec -it 你的pythonapp容器名称 python main.py
执行后终端会直接进入程序的交互状态,输入参数就能得到计算结果。
方式二:直接前台启动pythonapp服务
如果不需要同时启动其他服务,或者想直接在当前终端交互,可以直接启动pythonapp服务:
docker-compose up pythonapp
启动后程序会立刻在当前终端等待输入,输入完成后执行计算并输出结果。
内容的提问来源于stack exchange,提问作者Qdadedalus
相关产品推荐
相关产品推荐

