使用Docker安装swipl构建应用时apt-get交互式输入失败如何解决
解决方案
你遇到的安装失败是因为swi-prolog依赖的tzdata包在安装过程中会弹出交互式时区选择界面,Docker构建过程默认是非交互式环境,无法响应弹窗选择,你用printf传值的方式兼容性差,建议用Debian系官方推荐的非交互式安装配置修改Dockerfile:
修正后的Dockerfile
FROM ubuntu:latest # 关闭apt交互式提示 ENV DEBIAN_FRONTEND=noninteractive # 预配置时区(这里设为UTC,你也可以改成需要的时区,比如Asia/Shanghai) RUN echo "tzdata tzdata/Areas select Etc" | debconf-set-selections && \ echo "tzdata tzdata/Zones/Etc select UTC" | debconf-set-selections && \ apt-get update && \ # 加-y参数自动确认安装,无需手动输入Y apt-get install -y swi-prolog && \ # 清理apt缓存减小镜像体积 apt-get clean && \ rm -rf /var/lib/apt/lists/* # 全局设置PATH(如果有需要的话,默认swipl已经在系统PATH里) ENV PATH=/root/.local/bin:/usr/local/bin:/root/.local/bin:$PATH COPY hello.pl ./ # apt安装的swipl默认路径是/usr/bin/swipl,你之前写的/usr/local/bin路径不存在会报错 ENTRYPOINT /usr/bin/swipl -g 'consult("hello.pl").' -g 'hello.' -g 'halt.'
改动说明
- 新增
ENV DEBIAN_FRONTEND=noninteractive,告知apt全程不用弹出交互式配置窗口 - 提前用
debconf-set-selections预配置tzdata的时区选项,从根源避免弹出选择界面 apt-get install加-y参数,自动确认安装,不需要额外用printf传Y- 修正了swipl的执行路径,Ubuntu官方源安装的swi-prolog默认将二进制文件放在
/usr/bin目录下,不是你之前写的/usr/local/bin - 新增了apt缓存清理步骤,减小最终镜像的体积
构建运行后就能正常输出Hello from SWIPL的内容。
内容的提问来源于stack exchange,提问作者paul tarvydas
相关产品推荐
相关产品推荐

