For a comprehensive guide on deploying Xojo web apps to any server, please refer to the video tutorial available at: https://youtu.be/ARr7d6Z6CRY
- The Dockerfile below should be placed in the same directory as your Xojo project
- Remember to modify the
WEBAPP_NAME
variable on line 33 to match the name of your project - Feel free to customize this Dockerfile to suit your specific needs. We encourage you to share your modifications and experiences in the Xojo forum
# Step-by-Step Instructions for Building, Saving, and Running the Image:
# 1. Build the Docker image:
# "docker build -t hellodocker-image ."
# This creates a Docker image named "hellodocker-image" based on this Dockerfile.
#
# 2. Save the Docker image to a tar file:
# "docker save -o hellodocker-image.tar hellodocker-image"
# This saves the "hellodocker-image" to a file named "hellodocker-image.tar".
# You can use this file to transfer the image to another server.
#
# 3. Upload the .tar file to the remote server.
# After transferring the tar file, follow these steps on the remote server:
#
# 3.1 Load the Docker image:
# "docker load -i hellodocker-image.tar"
# This imports the image into the Docker environment on the server.
#
# 3.2 Run a container from the image:
# "docker run -d --name hellodocker-container --restart always -p 7000:80 hellodocker-image"
# This creates and starts a container named "hellodocker-container" that:
# - Restarts automatically if it stops (via `--restart always`).
# - Maps port 80 inside the container to port 7000 on the host machine.
#
# 3.3 Verify the web app is running:
# Open a web browser and navigate to http://server-ip:7000
# Replace "server-ip" with the IP address of your remote server.
#
# Complete video guide at: https://youtu.be/ARr7d6Z6CRY
# Use Ubuntu 22.04 as the base image for the container.
FROM ubuntu:22.04
# Define the name of the Xojo web app executable.
# This should match the exact name of your compiled Xojo web app (case-sensitive).
ENV WEBAPP_NAME=HelloDocker
# Prevent interactive prompts during the installation of dependencies.
ENV DEBIAN_FRONTEND=noninteractive
# Install required system libraries for the Xojo web app to run, and purge unnecessary software (PHP, Python, Apache)
RUN apt-get update && apt-get install -y --no-install-recommends \
curl \
ca-certificates \
libunwind8 \
libsoup2.4 \
libpango-1.0 \
libicu70 \
libglib2.0 \
libgtk-3-0 \
&& apt-get purge -y php* python3* apache2* libapache2-mod-php* \
&& apt-get autoremove -y \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN useradd --create-home ${WEBAPP_NAME}
# Set the working directory inside the container.
# This is where the web app files will be located.
WORKDIR /${WEBAPP_NAME}
# Copy the built Xojo web app from the build context into the container.
# Remember, this Dockerfile must be placed in the same folder as the Xojo project.
COPY ["Builds - ${WEBAPP_NAME}/Linux 64 bit/${WEBAPP_NAME}", "."]
# Change ownership of the application files to the non-root user
RUN chown -R ${WEBAPP_NAME}:${WEBAPP_NAME} /${WEBAPP_NAME}
# Ensure the main web app executable has permission to run
RUN chmod +x ${WEBAPP_NAME}
# Create a directory for persistent data storage.
# Ensure the data directory is owned by the non-root user.
RUN mkdir -p /home/${WEBAPP_NAME}/data && chown -R ${WEBAPP_NAME}:${WEBAPP_NAME} /home/${WEBAPP_NAME}/data
# Define the volume for the container to store data.
# The contents of "/home/${WEBAPP_NAME}/data" will persist outside the container.
VOLUME /home/${WEBAPP_NAME}/data
# Switch to the non-root user for security purposes.
# All subsequent instructions (including CMD) will run as this user.
USER ${WEBAPP_NAME}
# Expose port 80 inside the container.
# This allows the web app to listen on port 80, which will be mapped to port 7000
# on the host machine when the container is run.
EXPOSE 80
# Start the Xojo web app when the container runs.
# The app will listen on port 80 inside the container.
CMD ["sh", "-c", "./${WEBAPP_NAME} --port=80"]
Gabriel is a digital marketing enthusiast who loves coding with Xojo to create cool software tools for any platform. He is always eager to learn and share new ideas!