|  | @@ -0,0 +1,96 @@
 | 
											
												
													
														|  | 
 |  | +# Running CivetWeb in Docker
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +## Overview
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +This guide explains how to build and run CivetWeb using a multi-stage Dockerfile. The Dockerfile uses Alpine Linux for both the build and runtime stages, making the final image lightweight.
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +## Prerequisites
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +- Docker installed on your machine
 | 
											
												
													
														|  | 
 |  | +- Basic understanding of Docker commands
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +## Dockerfile Explained
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +### Build Stage
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +The build stage uses Alpine Linux 3.18 and installs the necessary build tools and libraries.
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +```Dockerfile
 | 
											
												
													
														|  | 
 |  | +FROM alpine:3.18 AS build
 | 
											
												
													
														|  | 
 |  | +RUN apk update && \
 | 
											
												
													
														|  | 
 |  | +    apk add --no-cache \
 | 
											
												
													
														|  | 
 |  | +    build-base zlib-dev
 | 
											
												
													
														|  | 
 |  | +```
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +The source code and other necessary files are copied into the `/civetweb` directory in the container.
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +```Dockerfile
 | 
											
												
													
														|  | 
 |  | +WORKDIR /civetweb
 | 
											
												
													
														|  | 
 |  | +COPY src ./src/
 | 
											
												
													
														|  | 
 |  | +COPY include ./include/
 | 
											
												
													
														|  | 
 |  | +COPY Makefile ./
 | 
											
												
													
														|  | 
 |  | +COPY resources ./resources/
 | 
											
												
													
														|  | 
 |  | +COPY *.md ./
 | 
											
												
													
														|  | 
 |  | +```
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +The Civetweb server is then built and installed into the `/app` directory.
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +```Dockerfile
 | 
											
												
													
														|  | 
 |  | +RUN make build && \
 | 
											
												
													
														|  | 
 |  | +    make WITH_ALL=1 && \
 | 
											
												
													
														|  | 
 |  | +    make install PREFIX=/app
 | 
											
												
													
														|  | 
 |  | +```
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +### Image Stage
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +The image stage also uses Alpine Linux 3.18 but installs only the runtime dependencies.
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +```Dockerfile
 | 
											
												
													
														|  | 
 |  | +FROM alpine:3.18
 | 
											
												
													
														|  | 
 |  | +RUN apk update && \
 | 
											
												
													
														|  | 
 |  | +    apk add --no-cache \
 | 
											
												
													
														|  | 
 |  | +    libstdc++ zlib
 | 
											
												
													
														|  | 
 |  | +```
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +A non-root user `civetweb` is created for security reasons.
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +```Dockerfile
 | 
											
												
													
														|  | 
 |  | +RUN addgroup -S civetweb && adduser -S civetweb -G civetweb
 | 
											
												
													
														|  | 
 |  | +USER civetweb
 | 
											
												
													
														|  | 
 |  | +```
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +The built application from the build stage is copied into this stage.
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +```Dockerfile
 | 
											
												
													
														|  | 
 |  | +COPY --chown=civetweb:civetweb --from=build /app/ /app/
 | 
											
												
													
														|  | 
 |  | +```
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +The container will listen on port 8080 at runtime.
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +```Dockerfile
 | 
											
												
													
														|  | 
 |  | +EXPOSE 8080
 | 
											
												
													
														|  | 
 |  | +```
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +Finally, the entry point for the container is set.
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +```Dockerfile
 | 
											
												
													
														|  | 
 |  | +ENTRYPOINT  [ "/app/bin/civetweb", "/app/etc/civetweb.conf" ]
 | 
											
												
													
														|  | 
 |  | +```
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +## Build and Run
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +To build the Docker image, run:
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +```bash
 | 
											
												
													
														|  | 
 |  | +docker build -t civetweb:latest .
 | 
											
												
													
														|  | 
 |  | +```
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +To run the container, execute:
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +```bash
 | 
											
												
													
														|  | 
 |  | +docker run -p 8080:8080 civetweb:latest
 | 
											
												
													
														|  | 
 |  | +```
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +## Conclusion
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +This Dockerfile provides a secure and efficient way to build and run CivetWeb. The use of multi-stage builds ensures that the final image is as small as possible. The `EXPOSE` directive informs that the application will listen on port 8080, making it easier to map ports when running the container.
 |