├── config └── default-startup.st ├── docker-entrypoint.sh ├── pharo-supervisord.conf ├── setup.sh ├── launch-pharo.sh ├── save-pharo.sh ├── LICENSE ├── Dockerfile └── README.md /config/default-startup.st: -------------------------------------------------------------------------------- 1 | "For supressing lost-changes-recovery dialog on start-up" 2 | EpLostChangesDetector enabled: false. 3 | -------------------------------------------------------------------------------- /docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -eu 2 | 3 | cmd="$1" 4 | 5 | /usr/local/bin/setup.sh 6 | 7 | if [ "${cmd}" == "save-pharo" ]; then 8 | /usr/local/bin/save-pharo.sh ${@:2} 9 | else 10 | /usr/bin/supervisord -n 11 | fi 12 | exit $? -------------------------------------------------------------------------------- /pharo-supervisord.conf: -------------------------------------------------------------------------------- 1 | [program:pharo] 2 | directory=%(ENV_PHARO_HOME)s 3 | command=bash -l -c '/usr/local/bin/launch-pharo.sh' 4 | autorestart=true 5 | stdout_logfile=%(ENV_PHARO_HOME)s/logs/%(ENV_PHARO_SUPERVISOR_LOG_NAME)s 6 | stdout_logfile_maxbytes=1MB 7 | stdout_logfile_backups=5 8 | stdout_capture_maxbytes=1MB 9 | redirect_stderr=true 10 | -------------------------------------------------------------------------------- /setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # ensure initial pharo image 4 | if ([ "$PHARO_IMAGE" = "Pharo.image" ] && [ ! -e "$PHARO_HOME/Pharo.image" ]) ; then 5 | cp /usr/local/bin/pharo/Pharo*.* $PHARO_HOME 6 | fi 7 | 8 | # supervisor log file 9 | mkdir -p $PHARO_HOME/logs && touch $PHARO_HOME/logs/$PHARO_SUPERVISOR_LOG_NAME 10 | 11 | # start base environments 12 | /usr/local/bin/setup-envs-all.sh & 13 | sleep 2 -------------------------------------------------------------------------------- /launch-pharo.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "Pharo launch parameters:" 4 | echo "PHARO_MODE: $PHARO_MODE" 5 | echo "PHARO_IMAGE: $PHARO_IMAGE" 6 | echo "PHARO_START_SCRIPT: '$PHARO_START_SCRIPT'" 7 | 8 | # Launch Pharo 9 | if [ "$PHARO_MODE" == "gui" ]; then 10 | echo "Launch Pharo in GUI mode" 11 | if [ -z "$PHARO_START_SCRIPT" ]; then 12 | pharo-ui $PHARO_IMAGE 13 | else 14 | pharo-ui $PHARO_IMAGE -e "$PHARO_START_SCRIPT" 15 | fi 16 | else 17 | echo "Launch Pharo in non-gui mode" 18 | if [ -z "$PHARO_START_SCRIPT" ]; then 19 | pharo -vm-display-null $PHARO_IMAGE --no-quit 20 | else 21 | pharo -vm-display-null $PHARO_IMAGE --no-quit -e "$PHARO_START_SCRIPT" 22 | fi 23 | fi 24 | -------------------------------------------------------------------------------- /save-pharo.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ORIGDIR=`pwd` 4 | BASEDIR=/usr/local/bin/pharo 5 | PHARO_CHANGE=${PHARO_IMAGE%.image}.changes 6 | 7 | if [ -e /root/data/$PHATO_IMAGE ]; then 8 | BASEDIR=/root/data 9 | fi 10 | 11 | BLDDIR=$HOME/build 12 | mkdir -p $BLDDIR 13 | cp -f $BASEDIR/*.sources $BLDDIR 14 | cp -f $BASEDIR/$PHARO_IMAGE $BLDDIR 15 | cp -f $BASEDIR/$PHARO_CHANGE $BLDDIR 16 | cd $BLDDIR 17 | 18 | if [ $# -lt 2 ]; then 19 | echo "Usage: save-pharo.sh {get|config} command params" 1>&2 20 | exit 1 21 | fi 22 | 23 | echo "## Pharo starts: $@" 24 | 25 | pharo-ui $PHARO_IMAGE ${@:1} 26 | 27 | cp -f $PHARO_IMAGE /root/data/$PHARO_IMAGE 28 | cp -f $PHARO_CHANGE /root/data/$PHARO_CHANGE 29 | 30 | echo "## DONE! Saved Pharo image to: /root/data/$PHARO_IMAGE" 31 | 32 | cd $ORIGDIR 33 | exit 0 34 | 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Masashi Umezawa 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mumez/ubuntu-vnc-supervisor 2 | LABEL maintainer="Masashi Umezawa " 3 | 4 | ## Install prerequisites and utilities 5 | RUN apt-get update && apt-get install -y \ 6 | libaudio2 \ 7 | unzip \ 8 | && rm -rf /var/lib/apt/lists/* 9 | 10 | ## OpenSSL 11 | # The Pharo VM requires OpenSSL 1.1.0g, which is not available in the default Ubuntu 22.04 repositories. 12 | # The following commands download and install the required version of OpenSSL. 13 | # Note: This is a workaround and may not be the best practice for production environments. 14 | RUN wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.0g-2ubuntu4_amd64.deb && \ 15 | dpkg -i libssl1.1_1.1.0g-2ubuntu4_amd64.deb && \ 16 | rm libssl1.1_1.1.0g-2ubuntu4_amd64.deb 17 | 18 | # -------------------- 19 | # Pharo 20 | # -------------------- 21 | ENV DISPLAY=:0 22 | ARG PHARO_IMAGE_VERSION=120 23 | ENV PHARO_MODE='gui' 24 | ENV PHARO_IMAGE='Pharo.image' 25 | ARG PHARO_DEFAULT_IMAGE_DIR='/root/data' 26 | ENV PHARO_HOME=${PHARO_DEFAULT_IMAGE_DIR} 27 | ENV PHARO_START_SCRIPT=${PHARO_DEFAULT_IMAGE_DIR}/config/default-startup.st 28 | 29 | RUN mkdir pharo && cd pharo \ 30 | && apt-get update && apt-get install -y --no-install-recommends \ 31 | curl \ 32 | unzip \ 33 | && curl https://get.pharo.org/64/${PHARO_IMAGE_VERSION}+vm | bash \ 34 | && mv ../pharo /usr/local/bin/ \ 35 | && apt-get remove -y \ 36 | unzip \ 37 | && rm -rf /var/lib/apt/lists/* 38 | 39 | ENV PATH="/usr/local/bin/pharo:${PATH}" 40 | 41 | # -------------------- 42 | # Setup scripts 43 | # -------------------- 44 | ADD ./launch-pharo.sh /usr/local/bin/ 45 | ADD ./save-pharo.sh /usr/local/bin/ 46 | ADD ./setup.sh /usr/local/bin/ 47 | ADD ./docker-entrypoint.sh /usr/local/bin/ 48 | RUN chmod +x /usr/local/bin/* 49 | 50 | # -------------------- 51 | # Workspace 52 | # -------------------- 53 | WORKDIR ${PHARO_DEFAULT_IMAGE_DIR} 54 | 55 | RUN cp /usr/local/bin/pharo/Pharo*.* ${PHARO_DEFAULT_IMAGE_DIR} 56 | ADD ./config/default-startup.st ${PHARO_DEFAULT_IMAGE_DIR}/config/ 57 | 58 | VOLUME ${PHARO_DEFAULT_IMAGE_DIR} 59 | 60 | EXPOSE 9000 61 | 62 | # -------------------- 63 | # Supervisor 64 | # -------------------- 65 | ENV PHARO_SUPERVISOR_LOG_NAME=pharo-supervisord.log 66 | COPY pharo-supervisord.conf /etc/supervisor/conf.d/pharo-supervisord.conf 67 | 68 | # -------------------- 69 | # ENTRYPOINT 70 | # -------------------- 71 | ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] 72 | CMD ["supervisord"] -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # pharo-vnc-supervisor 2 | 3 | A Docker image for [Pharo Smalltalk](http://www.pharo-project.org/ "Pharo"). Especially suitable for web application development and delivery. 4 | 5 | - Pharo process is daemonized by supervisord. 6 | - Debuggable via VNC. 7 | 8 | ## Usages 9 | 10 | ```bash 11 | docker run --name my_pharo -d -p 5900:5900 -p 6901:6901 mumez/pharo-vnc-supervisor 12 | ``` 13 | 14 | You can access the running pharo image via VNC client or web browser. 15 | (the default password is 'vncpassword') 16 | 17 | - VNC client: `yourhost:5900` 18 | - Web browser: `http://yourhost:6901/?password=vncpassword` 19 | 20 | ### How to start with a customized Pharo image 21 | 22 | 1. Place your customized Pharo image to your docker-host data directory (For example, `$HOME/docker/pharo/data`). 23 | 2. Use `docker run` `-v` option to mount the data direcotry. 24 | 25 | ```bash 26 | docker run --name my_pharo -d -p 5900:5900 -p 6901:6901 \ 27 | -v=$HOME/docker/pharo/data:/root/data \ 28 | mumez/pharo-vnc-supervisor 29 | ``` 30 | 31 | ### How to build a customized Pharo image in a container 32 | 33 | You can use `save-pharo` command to build a customized Pharo image. 34 | 35 | #### Install by Metacello 36 | 37 | `save-pharo metacello ` 38 | 39 | ```bash 40 | REPOS_URL=github://mumez/Tarantalk/repository 41 | docker run --rm -p 5900:5900 -p 6901:6901 \ 42 | -v=$HOME/docker/pharo/data:/root/data \ 43 | mumez/pharo-vnc-supervisor \ 44 | save-pharo metacello install $REPOS_URL BaselineOfTarantalk 45 | ``` 46 | 47 | #### Install by Configuration 48 | 49 | `save-pharo config ` 50 | 51 | ```bash 52 | docker run --rm -p 5900:5900 -p 6901:6901 \ 53 | -v=$HOME/docker/pharo/data:/root/data \ 54 | mumez/pharo-vnc-supervisor \ 55 | save-pharo config http://smalltalkhub.com/mc/Pharo/MetaRepoForPharo60/main/ \ 56 | ConfigurationOfNeo4reSt --install=stable 57 | ``` 58 | 59 | #### Install from Catalog (Obsolete - available before Pharo 6) 60 | 61 | `save-pharo get ` 62 | 63 | ```bash 64 | docker run --rm -p 5900:5900 -p 6901:6901 \ 65 | -v=$HOME/docker/pharo/data:/root/data \ 66 | mumez/pharo-vnc-supervisor \ 67 | save-pharo get Tarantube 68 | ``` 69 | 70 | ### How to change default Pharo image version 71 | 72 | By default, Pharo 12.0 will be installed to the docker image. You can specify other versions when building a docker image. 73 | 74 | ```bash 75 | docker build -t pharo130-vnc-supervisor --build-arg PHARO_IMAGE_VERSION=130 . 76 | docker run --name my_pharo130 -d -p 5900:5900 -p 6901:6901 pharo130-vnc-supervisor 77 | ``` 78 | 79 | ## Settings 80 | 81 | You can change these settings via `docker run` `-e` option. 82 | 83 | ### Pharo related environment variables 84 | 85 | ```bash 86 | PHARO_SUPERVISOR_LOG_NAME=pharo-supervisord.log 87 | PHARO_IMAGE=Pharo.image 88 | PHARO_START_SCRIPT= 89 | PHARO_MODE=gui 90 | ``` 91 | 92 | ### VNC related environment variables 93 | 94 | Please see [ubuntu-vnc-supervisor](https://github.com/mumez/ubuntu-vnc-supervisor). 95 | --------------------------------------------------------------------------------