diff --git a/Dockerfile b/Dockerfile index 5773a38..85ee8ff 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # 1. 基础镜像 -FROM ubuntu:24.04 +FROM ubuntu:20.04 # 2. 预备环境 (为了能跑通 InstallSDK 脚本) # 设置非交互模式,防止 apt 卡住 @@ -23,7 +23,7 @@ RUN apt-get update && apt-get install -y \ WORKDIR /root # 复制源码包和安装脚本 COPY secondo-RC_430.zip . -COPY InstallSDK_Ubuntu_24_04.bash . +COPY InstallSDK_Ubuntu_20_04.bash . # 4. 解压源码 # 解压并重命名为 secondo (模拟你物理机上的 /home/db/secondo) @@ -31,11 +31,16 @@ RUN unzip -q secondo-RC_430.zip \ && mv secondo-RC_430 secondo \ && rm secondo-RC_430.zip -# 5. 【核心步骤】执行官方安装脚本 -# - chmod: 给脚本执行权限 -# - yes | ...: 自动回答脚本中可能出现的 "Do you want to continue? [Y/n]" -# - 脚本会自动安装 gcc, flex, bison, java 等所有依赖,并生成 .secondorc -RUN bash InstallSDK_Ubuntu_24_04.bash +# 5. 【核心步骤】确保无交互地安装系统包并执行官方安装脚本 +# 预置时区(避免 tzdata 在构建时弹出交互式选择)并以非交互模式运行安装脚本 +RUN ln -fs /usr/share/zoneinfo/Etc/UTC /etc/localtime && \ + apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends tzdata && \ + dpkg-reconfigure -f noninteractive tzdata && \ + rm -rf /var/lib/apt/lists/* + +# 以非交互模式运行官方安装脚本(脚本内部使用 apt-get -y 已包含,但某些包仍会触发 debconf) +RUN DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC bash InstallSDK_Ubuntu_20_04.bash # 6. 配置环境加载方式 # 脚本运行完会生成 /root/.secondorc @@ -49,7 +54,7 @@ WORKDIR /root/secondo RUN chmod -R +x . # [修复 GCC 13] 去掉 -Werror,否则编译必挂 -RUN find . -name "makefile*" -print0 | xargs -0 sed -i 's/-Werror//g' +# RUN find . -name "makefile*" -print0 | xargs -0 sed -i 's/-Werror//g' # [修复 API] 跳过 API 编译,防止链接错误 # RUN sed -i '/API/d' makefile && \ @@ -65,10 +70,18 @@ RUN source /root/.secondorc /root/secondo && \ make clean && \ make -# 9. 验证安装 -RUN ls -l bin/SecondoTTYCS bin/SecondoListener +# 10. 安装并配置 SSH,复制 entrypoint 脚本并暴露端口 +RUN apt-get update && apt-get install -y --no-install-recommends openssh-server && \ + mkdir -p /var/run/sshd && \ + echo 'root:123' | chpasswd && \ + sed -i 's/^#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config || true && \ + sed -i 's/^#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config || true && \ + rm -rf /var/lib/apt/lists/* -# 10. 启动配置 -EXPOSE 1234 -# 容器启动时,也先加载环境,再启动 Listener -CMD source /root/.secondorc /root/secondo && ./bin/SecondoListener \ No newline at end of file +# 复制并赋予 entrypoint 可执行权限(entrypoint 启动 sshd 并启动 SecondoListener) +COPY entrypoint.sh /root/entrypoint.sh +RUN chmod +x /root/entrypoint.sh + +EXPOSE 1234 22 +# 容器启动时运行 entrypoint:先启动 sshd,再 source .secondorc 并 exec SecondoListener +CMD ["/root/entrypoint.sh"] diff --git a/Dockerfile24.04 b/Dockerfile24.04 new file mode 100644 index 0000000..5773a38 --- /dev/null +++ b/Dockerfile24.04 @@ -0,0 +1,74 @@ +# 1. 基础镜像 +FROM ubuntu:24.04 + +# 2. 预备环境 (为了能跑通 InstallSDK 脚本) +# 设置非交互模式,防止 apt 卡住 +ENV DEBIAN_FRONTEND=noninteractive + +# 安装运行 InstallSDK 脚本所需的“最小”前置工具 +# - sudo: 脚本里通常有 sudo 命令 +# - unzip: 解压你的源码包 +# - lsb-release: 脚本可能会检测系统版本 +# - file/wget: 脚本常用的工具 +RUN apt-get update && apt-get install -y \ + sudo \ + unzip \ + lsb-release \ + file \ + wget \ + nano \ + && rm -rf /var/lib/apt/lists/* + +# 3. 准备文件 +WORKDIR /root +# 复制源码包和安装脚本 +COPY secondo-RC_430.zip . +COPY InstallSDK_Ubuntu_24_04.bash . + +# 4. 解压源码 +# 解压并重命名为 secondo (模拟你物理机上的 /home/db/secondo) +RUN unzip -q secondo-RC_430.zip \ + && mv secondo-RC_430 secondo \ + && rm secondo-RC_430.zip + +# 5. 【核心步骤】执行官方安装脚本 +# - chmod: 给脚本执行权限 +# - yes | ...: 自动回答脚本中可能出现的 "Do you want to continue? [Y/n]" +# - 脚本会自动安装 gcc, flex, bison, java 等所有依赖,并生成 .secondorc +RUN bash InstallSDK_Ubuntu_24_04.bash + +# 6. 配置环境加载方式 +# 脚本运行完会生成 /root/.secondorc +# 我们将它写入 .bashrc,这样你进入容器交互时环境是好的 +RUN echo "source /root/.secondorc /root/secondo" >> /root/.bashrc + +# 7. 源码补丁 (这是必须要做的,因为脚本只负责装环境,不负责修源码里的 GCC 13 错误) +WORKDIR /root/secondo + +# [修复权限] 对应你物理机的 chmod 操作 +RUN chmod -R +x . + +# [修复 GCC 13] 去掉 -Werror,否则编译必挂 +RUN find . -name "makefile*" -print0 | xargs -0 sed -i 's/-Werror//g' + +# [修复 API] 跳过 API 编译,防止链接错误 +# RUN sed -i '/API/d' makefile && \ + # sed -i 's/update-config \\/update-config/' makefile + +# 8. 编译 Secondo +# 切换 Docker 的默认 Shell 为 bash,否则 source 命令无法使用 +SHELL ["/bin/bash", "-c"] + +# 关键:先 source 脚本生成的配置,再编译! +# 这样 make 就能读到 InstallSDK 设置的所有变量 +RUN source /root/.secondorc /root/secondo && \ + make clean && \ + make + +# 9. 验证安装 +RUN ls -l bin/SecondoTTYCS bin/SecondoListener + +# 10. 启动配置 +EXPOSE 1234 +# 容器启动时,也先加载环境,再启动 Listener +CMD source /root/.secondorc /root/secondo && ./bin/SecondoListener \ No newline at end of file diff --git a/InstallSDK_Ubuntu_20_04.bash b/InstallSDK_Ubuntu_20_04.bash new file mode 100644 index 0000000..6d87063 --- /dev/null +++ b/InstallSDK_Ubuntu_20_04.bash @@ -0,0 +1,110 @@ + +#!/bin/bash + +# select platform + +if [ "$1" == "-onlyrc" ]; then + onlyrc=TRUE +fi + + + +platform=$(uname -i) + + +if [ -z $onlyrc ]; then + +# Update the system +sudo apt-get -y update +sudo apt-get -y upgrade + +# Install all tools required to compile Secondo +sudo apt-get -y install flex bison gcc g++ libdb5.3 libdb5.3-dev libdb5.3++ libdb5.3++-dev db5.3-util libjpeg62 libjpeg62-dev libgsl0-dev openjdk-8-jdk libreadline-dev librecode-dev libgmp-dev libncurses-dev libxml2-dev original-awk libquadmath0 libgmp-dev libgmp10 original-awk libboost-all-dev libbison-dev + +# Install latex and okular to be able to use pdview within Secondo: +sudo apt-get -y install texlive okular + +# Deinstall prolog / install java (not installed in a "fresh" Ubunu installation) +sudo apt-get -y install swi-prolog swi-prolog-nox swi-prolog-x swi-prolog-java + +fi + + +cd $HOME + + +PLVER=$(swipl --version | awk {'print $3'}) + +if [ "$platform" == "i686" ]; then + echo 'if [ "$1" == "" ]; then' >$HOME/.secondorc + echo ' SEC_DIR=$HOME/secondo' >>$HOME/.secondorc + echo 'else' >>$HOME/.secondorc + echo ' SEC_DIR=$1' >>$HOME/.secondorc + echo 'fi' >>$HOME/.secondorc + echo '' >>$HOME/.secondorc + echo 'export SECONDO_PLATFORM=linux' >>$HOME/.secondorc + echo 'export SECONDO_BUILD_DIR=$SEC_DIR' >>$HOME/.secondorc + echo 'export BERKELEY_DB_LIB="db_cxx"' >>$HOME/.secondorc + echo 'export BERKELEY_DB_DIR=/usr' >>$HOME/.secondorc + echo 'export J2SDK_ROOT=/usr/lib/jvm/java-8-openjdk-i386/' >>$HOME/.secondorc + echo 'export SWI_HOME_DIR=/usr/lib/swi-prolog' >>$HOME/.secondorc + echo 'export PL_LIB_DIR=$SWI_HOME_DIR/lib/i386/' >>$HOME/.secondorc + echo 'export PL_DLL_DIR=$PL_LIB_DIR' >> $HOME/.secondorc + echo 'export PL_INCLUDE_DIR=$SWI_HOME_DIR/include' >>$HOME/.secondorc + echo 'export PL_VERSION=70203' >>$HOME/.secondorc + echo 'export JPL_DLL=$PL_LIB_DIR/libjpl.so' >>$HOME/.secondorc + echo 'export JPL_JAR=$SWI_HOME_DIR/lib/jpl.jar' >>$HOME/.secondorc + echo 'export readline=true' >>$HOME/.secondorc + echo 'export PATH=$PATH:.:$SECONDO_BUILD_DIR/Tools/pd' >>$HOME/.secondorc + echo 'export SECONDO_CONFIG=$SECONDO_BUILD_DIR/bin/SecondoConfig.ini' >>$HOME/.secondorc + echo 'export JAVAVER="1.8"' >>$HOME/.secondorc + echo 'export PD_HEADER=$SECONDO_BUILD_DIR/Tools/pd/pd_header_listing' >>$HOME/.secondorc + echo 'export PD_DVI_VIEWER=/usr/bin/okular' >>$HOME/.secondorc + echo 'export PD_PS_VIEWER=/usr/bin/evince' >>$HOME/.secondorc + echo 'export PL_LIB=swipl' >>$HOME/.secondorc + echo '' >>$HOME/.secondorc + echo 'alias secroot='export SECONDO_BUILD_DIR=$PWD'' >>$HOME/.secondorc + echo '' >>$HOME/.secondorc + echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PL_LIB_DIR' >>$HOME/.secondorc +else + echo 'if [ "$1" == "" ]; then' >$HOME/.secondorc + echo ' SEC_DIR=$HOME/secondo' >>$HOME/.secondorc + echo 'else' >>$HOME/.secondorc + echo ' SEC_DIR=$1' >>$HOME/.secondorc + echo 'fi' >>$HOME/.secondorc + echo '' >>$HOME/.secondorc + echo 'export SECONDO_PLATFORM=linux64' >>$HOME/.secondorc + echo 'export SECONDO_BUILD_DIR=$SEC_DIR' >>$HOME/.secondorc + echo 'export BERKELEY_DB_LIB="db_cxx"' >>$HOME/.secondorc + echo 'export BERKELEY_DB_DIR=/usr' >>$HOME/.secondorc + echo 'export J2SDK_ROOT=/usr/lib/jvm/java-8-openjdk-amd64/' >>$HOME/.secondorc + echo 'export SWI_HOME_DIR=/usr/lib/swi-prolog' >>$HOME/.secondorc + if [ -f "/usr/lib/swi-prolog/lib/x86_64/libjpl.so" ]; then + echo 'export PL_LIB_DIR=$SWI_HOME_DIR/lib/x86_64/' >>$HOME/.secondorc + else + echo 'export PL_LIB_DIR=$SWI_HOME_DIR/lib/amd64/' >>$HOME/.secondorc + fi + echo 'export PL_DLL_DIR=$PL_LIB_DIR' >> $HOME/.secondorc + echo 'export PL_INCLUDE_DIR=$SWI_HOME_DIR/include' >>$HOME/.secondorc + echo 'export PL_VERSION=70203' >>$HOME/.secondorc + echo 'export JPL_DLL=$PL_LIB_DIR/libjpl.so' >>$HOME/.secondorc + echo 'export JPL_JAR=$SWI_HOME_DIR/lib/jpl.jar' >>$HOME/.secondorc + echo 'export readline=true' >>$HOME/.secondorc + echo 'export PATH=$PATH:.:$SECONDO_BUILD_DIR/Tools/pd' >>$HOME/.secondorc + echo 'export SECONDO_CONFIG=$SECONDO_BUILD_DIR/bin/SecondoConfig.ini' >>$HOME/.secondorc + echo 'export JAVAVER="1.8"' >>$HOME/.secondorc + echo 'export PD_HEADER=$SECONDO_BUILD_DIR/Tools/pd/pd_header_listing' >>$HOME/.secondorc + echo 'export PD_DVI_VIEWER=/usr/bin/okular' >>$HOME/.secondorc + echo 'export PD_PS_VIEWER=/usr/bin/evince' >>$HOME/.secondorc + echo '' >>$HOME/.secondorc + echo 'export LD_LIBRARY_PATH=$BERKELEY_DB_DIR/lib:$SWI_HOME_DIR/lib:$PL_LIB_DIR' >>$HOME/.secondorc + echo '' >>$HOME/.secondorc + echo 'alias secroot='export SECONDO_BUILD_DIR=$PWD'' >>$HOME/.secondorc + echo '' >>$HOME/.secondorc + echo 'export PL_LIB=swipl' >>$HOME/.secondorc + echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PL_LIB_DIR' >>$HOME/.secondorc +fi + + + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..9fb2ebf --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +# Secondo + +ubuntu的secondo运行环境,默认使用20.04。 + +## 安装 + +```bash +sudo docker build -t secondo:20.04 . +sudo docker run -d -p 1234:1234 -p 2222:22 --name my-secondo secondo:20.04 +``` diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 0000000..9ae5a12 --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,11 @@ +#!/bin/bash +set -e + +# # 等待 /root/.secondorc 可用(InstallSDK 有可能已生成) +if [ -f /root/.secondorc ]; then + # source .secondorc 并传入 secondo 路径参数(保持与脚本原意一致) + source /root/.secondorc /root/secondo || true +fi + +# 启动 sshd(在后台) +/usr/sbin/sshd -D