... when two worlds come together
Hercules is actively developed under the project Hercules Hyperion and the current release 4.5 is available on github. I tried to compile it on my macOS but got some trouble with the software not being available and so I decide to give docker a chance and carry this cute little Dinosaur. And it was actually quite easy. (Attention: This approach is only tested on x86 architectures. I tried a build on a Raspberry Pi 4 with 64Bit and it failed due to missing external libraries. I'm working on it)
First, I cloned the github repository on a local directory.
git clone https://github.com/SDL-Hercules-390/hyperion.git
Then you will have the whole project on your local drive. The installation instructions in the project documentation are straightforward and so I followed them up in a Dockerfile. (Copy this Dockerfile into the project directory.)
# # Start building hercules-hyperion docker image from a debian base # since it does not need many stuff the slim image should be sufficient # # The extra software is installed with apt. # FROM debian:stable-slim AS env RUN mkdir /opt/build &&\ apt-get update &&\ apt-get -y install git wget time &&\ apt-get -y install build-essential cmake flex gawk m4 autoconf automake libtool-bin libltdl-dev &&\ apt-get -y install libbz2-dev zlib1g-dev &&\ apt-get -y install libcap2-bin # No the environment is set and the build can Start # copy all the project files into the build directory and Start # building it. # FROM env AS build WORKDIR /opt/build COPY . /opt/build RUN ./configure &&\ mkdir /opt/hercules &&\ make &&\ make install &&\ /sbin/ldconfig -v # # With the hercules hyperion build it is no easy to Start # hercules. # # The docker image expects a working area mounted to /opt/hercules # and in that directory there must be the configuratio under conf/herculues.cnf # The start script inside the hercules console has to be under scripts/ipl.rc # # <DirecotryMountedUnder/opt/hercules> # . # +--conf/hercules.cnf # +--scripts/ipl.rc # FROM build AS hercules-hyperion WORKDIR /opt/build VOlUME /opt/hercules CMD ["/bin/bash", "/opt/build/container-start"]
The Dockerfile has three stages. The first stage starts from the Debian-slim image and follows the installation instructions of the project documentation. It leaves a stage env to use in the next stage.
The stage build copies the whole project into the working directory of the image and follows the make instructions of the project documentation. This leads to a new stage build that has a compiled and installed Hercules inside. The only thing I need to add was the /sbin/ldconfig -v command to make the Hercules libraries accessible in the image.
The third stage is the final stage which builds the final image and makes Hercules run in a docker container. It uses a little bash script:
#!/bin/bash ( cd /opt/hercules export HERCULES_RC=scripts/ipl.rc hercules -f conf/hercules.cnf -d >3033.log )
The script changes to a directory /opt/hercules, sets the environment variable HERCULES_RC to scripts/ipl.rc, and starts the Hercules emulator. As you may see this script implies some setups from the user. You have to mount a directory with your own hercules environment under /opt/hercules and in that environment you have to store the configuration under conf/hercules.cnf and the startup script under scripts/ipl.rc
Starting Hercules is one thing. But installing the software and bringing it all together is a much more difficult task. At least for me as a java developer. There are some readily defined distributions with all devices, dasds, configs, and start scripts needed available and you surely want to use them. Like the TK-4 distribution mentioned in the other articles. This distribution has the configuration under conf/tk4-.cnf. Copy it to conf/hercules.cnf and you are fine. The start script is under scripts/ipl.rc as required by the container script.
docker build -t hercules-hyperion .
When you start the docker build like:
docker will create the image. To start the image use this command:
docker run -v /<YOUR HERCULES ENVIRONMENT DIRECTORY>:/opt/hercules \ -p 3270:3270 \ -p 3278:3278 \ -p 8038:8038 \ --name hercules \ hercules-hyperion
Now you have a running hercules 4.5 hyperion instance in docker. The ports are exposed to 3270 (3270-Terminal emulation), 3278 (Telnet port) and 8038 (Web-Server)