Skip to content

Commit 6d259f3

Browse files
authored
Feat/easier maintenance (#115)
- [Feature] : Dockerfile Templatization - [Feature] : Add support for build and test image with Docker and Podman - [Fix] : Curl updated to > 8.x for Alpine >= 3.17 - [Fix] : Workflow setup-bats action for Node version deprecation
1 parent 09d8e52 commit 6d259f3

File tree

20 files changed

+595
-491
lines changed

20 files changed

+595
-491
lines changed

.github/workflows/docker-build.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ jobs:
5454
restore-keys: |
5555
${{ runner.os }}-buildx-
5656
57+
- name: Create Dockerfile
58+
run: |
59+
make Dockerfile
60+
5761
- name: Build "${{ steps.prep.outputs.docker-image-name }}" Docker Image
5862
id: build
5963
uses: docker/build-push-action@v4

.github/workflows/docker-release.yml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,10 @@ jobs:
8484
type=raw,value=${{ needs.init.outputs.version-minor }}-${{ matrix.image-variant }}
8585
type=raw,value=${{ needs.init.outputs.version-major }}-${{ matrix.image-variant }}
8686
87+
- name: Create Dockerfile
88+
run: |
89+
make Dockerfile
90+
8791
- name: Build "${{ needs.init.outputs.docker-image-name }}:${{ needs.init.outputs.github-ci-sha-short }}-${{ matrix.image-variant }}" Docker Image
8892
id: build
8993
uses: docker/build-push-action@v4
@@ -133,7 +137,7 @@ jobs:
133137
chmod 777 test/demo/skeleton
134138
135139
- name: Setup BATS testing framework
136-
uses: mig4/setup-bats@v1
140+
uses: zebby76/setup-bats@v1
137141
with:
138142
bats-version: 1.2.1
139143

@@ -178,6 +182,7 @@ jobs:
178182
env:
179183
DOCKER_IMAGE_NAME: ${{ needs.init.outputs.docker-image-name }}:${{ needs.init.outputs.github-ci-sha-short }}-${{ matrix.image-variant }}
180184
EMS_VERSION: ${{ needs.init.outputs.version-patch }}
185+
CONTAINER_ENGINE: docker
181186
run: |
182187
docker network create docker_default
183188
docker pull appropriate/curl:latest
@@ -387,4 +392,4 @@ jobs:
387392
- uses: joutvhu/delete-artifact@v1
388393
with:
389394
name: |
390-
${{ matrix.image-variant }}
395+
${{ matrix.image-variant }}

.gitignore

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
local.txt
2-
test/demo
1+
test/demo
2+
Dockerfile

Dockerfile

Lines changed: 0 additions & 100 deletions
This file was deleted.

Dockerfiles/Args.m4

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
ARG VERSION_ARG=""
2+
ARG RELEASE_ARG=""
3+
ARG BUILD_DATE_ARG=""
4+
ARG VCS_REF_ARG=""

Dockerfiles/Builder.m4

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
ENV ELASTICMS_VERSION=${VERSION_ARG:-5.1.2} \
2+
ELASTICMS_DOWNLOAD_URL="https://github.com/ems-project/elasticms-web/archive"
3+
4+
RUN echo "Download and install ElastiCMS ..." \
5+
&& mkdir -p /opt/src \
6+
&& curl -sSfLk ${ELASTICMS_DOWNLOAD_URL}/${ELASTICMS_VERSION}.tar.gz \
7+
| tar -xzC /opt/src --strip-components=1 \
8+
&& COMPOSER_MEMORY_LIMIT=-1 composer -vvvv install --no-interaction --no-suggest --no-scripts --working-dir /opt/src -o \
9+
&& rm -rf /opt/src/bootstrap/cache/* /opt/src/.env /opt/src/.env.dist

Dockerfiles/Common.m4

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
LABEL be.fgov.elasticms.web.build-date=$BUILD_DATE_ARG \
2+
be.fgov.elasticms.web.name="elasticms-web" \
3+
be.fgov.elasticms.web.description="Website Skeleton of the ElasticMS suite." \
4+
be.fgov.elasticms.web.url="https://hub.docker.com/repository/docker/elasticms/website-skeleton" \
5+
be.fgov.elasticms.web.vcs-ref=$VCS_REF_ARG \
6+
be.fgov.elasticms.web.vcs-url="https://github.com/ems-project/elasticms-web-docker" \
7+
be.fgov.elasticms.web.vendor="[email protected]" \
8+
be.fgov.elasticms.web.version="$VERSION_ARG" \
9+
be.fgov.elasticms.web.release="$RELEASE_ARG" \
10+
be.fgov.elasticms.web.schema-version="1.0"
11+
12+
USER root
13+
14+
COPY bin/ /opt/bin/container-entrypoint.d/
15+
COPY etc/ /usr/local/etc/
16+
COPY --from=builder /opt/src /opt/src
17+
18+
ENV APP_DISABLE_DOTENV=true
19+
ENV EMS_METRIC_PORT="9090"
20+
21+
RUN echo -e "\nListen ${EMS_METRIC_PORT}\n" >> /etc/apache2/httpd.conf \
22+
&& echo "Setup permissions on filesystem for non-privileged user ..." \
23+
&& chmod -Rf +x /opt/bin \
24+
&& chown -Rf ${PUID:-1001}:0 /opt \
25+
&& chmod -R ug+rw /opt \
26+
&& find /opt -type d -exec chmod ug+x {} \;
27+
28+
USER ${PUID:-1001}
29+
30+
EXPOSE ${EMS_METRIC_PORT}/tcp
31+
32+
HEALTHCHECK --start-period=10s --interval=1m --timeout=5s --retries=5 \
33+
CMD curl --fail --header "Host: default.localhost" http://localhost:9000/index.php || exit 1

Dockerfiles/Dockerfile.in

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# syntax=docker/dockerfile:1.3
2+
FROM docker.io/elasticms/base-php:8.1-apache-dev as builder
3+
4+
# include(Args.m4)
5+
# include(Builder.m4)
6+
7+
FROM docker.io/elasticms/base-php:8.1-apache as prd
8+
9+
LABEL be.fgov.elasticms.web.environment="prd"
10+
11+
# include(Args.m4)
12+
# include(Common.m4)
13+
14+
FROM docker.io/elasticms/base-php:8.1-apache-dev as dev
15+
16+
LABEL be.fgov.elasticms.web.environment="dev"
17+
18+
# include(Args.m4)
19+
# include(Common.m4)

Makefile

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ ifneq (,$(wildcard ./.build.env))
55
export
66
endif
77

8+
LIB = ./Dockerfiles
9+
DOCKERFILE=Dockerfile.in
10+
811
GIT_HASH ?= $(shell git log --format="%h" -n 1)
912
BUILD_DATE ?= $(shell date -u +'%Y-%m-%dT%H:%M:%SZ')
1013

@@ -14,11 +17,14 @@ ELASTICMS_WEB_VERSION ?= 5.0.0
1417
# Default Docker image name (if no .build.env file provided)
1518
DOCKER_IMAGE_NAME ?= docker.io/elasticms/website-skeleton
1619

20+
CONTAINER_ENGINE ?= docker
21+
CONTAINER_TARGET_IMAGE_FORMAT ?= docker
22+
1723
_BUILD_ARGS_TARGET ?= prd
1824
_BUILD_ARGS_TAG ?= latest
1925

2026
.DEFAULT_GOAL := help
21-
.PHONY: help build build-dev build-all test test-dev test-all
27+
.PHONY: help build build-dev build-all test test-dev test-all Dockerfile
2228

2329
help: # Show help for each of the Makefile recipes.
2430
@grep -E '^[a-zA-Z0-9 -]+:.*#' Makefile | sort | while read -r l; do printf "\033[1;32m$$(echo $$l | cut -f 1 -d':')\033[00m:$$(echo $$l | cut -f 2- -d'#')\n"; done
@@ -38,14 +44,27 @@ _build-%:
3844
-e _BUILD_ARGS_TAG="${ELASTICMS_WEB_VERSION}-$*" \
3945
-e _BUILD_ARGS_TARGET="$*"
4046

41-
_builder:
42-
@docker build \
43-
--build-arg VERSION_ARG="${ELASTICMS_WEB_VERSION}" \
44-
--build-arg RELEASE_ARG="${_BUILD_ARGS_TAG}" \
45-
--build-arg BUILD_DATE_ARG="${BUILD_DATE}" \
46-
--build-arg VCS_REF_ARG="${GIT_HASH}" \
47-
--target ${_BUILD_ARGS_TARGET} \
48-
--tag ${DOCKER_IMAGE_NAME}:${_BUILD_ARGS_TAG} .
47+
_builder: _dockerfile
48+
ifeq ($(CONTAINER_ENGINE),podman)
49+
@echo "Building $(CONTAINER_TARGET_IMAGE_FORMAT) image format with buildah"
50+
@buildah bud --no-cache --pull-always --force-rm --squash \
51+
--build-arg VERSION_ARG="${ELASTICMS_WEB_VERSION}" \
52+
--build-arg RELEASE_ARG="${_BUILD_ARGS_TAG}" \
53+
--build-arg BUILD_DATE_ARG="${BUILD_DATE}" \
54+
--build-arg VCS_REF_ARG="${GIT_HASH}" \
55+
--format ${CONTAINER_TARGET_IMAGE_FORMAT} \
56+
--target ${_BUILD_ARGS_TARGET} \
57+
--tag ${DOCKER_IMAGE_NAME}:${_BUILD_ARGS_TAG} .
58+
else
59+
@echo "Building $(CONTAINER_TARGET_IMAGE_FORMAT) image format with docker"
60+
@docker build --no-cache --force-rm --progress=plain \
61+
--build-arg VERSION_ARG="${ELASTICMS_WEB_VERSION}" \
62+
--build-arg RELEASE_ARG="${_BUILD_ARGS_TAG}" \
63+
--build-arg BUILD_DATE_ARG="${BUILD_DATE}" \
64+
--build-arg VCS_REF_ARG="${GIT_HASH}" \
65+
--target ${_BUILD_ARGS_TARGET} \
66+
--tag ${DOCKER_IMAGE_NAME}:${_BUILD_ARGS_TAG} .
67+
endif
4968

5069
test: # Test [elasticms-website-skeleton] [prd] variant Docker images
5170
@$(MAKE) -s _tester-prd
@@ -58,9 +77,17 @@ test-all: # Test [elasticms-website-skeleton] [prd,dev] variant Docker images
5877
@$(MAKE) -s _tester-dev
5978

6079
_tester-%:
80+
@echo "Test image with $(CONTAINER_ENGINE) container engine"
6181
@$(MAKE) -s _tester \
6282
-e DOCKER_IMAGE_NAME="${DOCKER_IMAGE_NAME}:${ELASTICMS_WEB_VERSION}-$*" \
63-
-e EMS_VERSION="${ELASTICMS_WEB_VERSION}"
83+
-e EMS_VERSION="${ELASTICMS_WEB_VERSION}" \
84+
-e CONTAINER_ENGINE="${CONTAINER_ENGINE}"
6485

6586
_tester:
66-
@bats test/tests.bats
87+
@bats test/tests.bats
88+
89+
Dockerfile: # generate Dockerfile
90+
@$(MAKE) -s _dockerfile
91+
92+
_dockerfile: $(LIB)/*.m4
93+
sed -e 's/# include(\(.*\))/include(\1)/g' $(LIB)/$(DOCKERFILE) | m4 -I $(LIB) > $(DOCKERFILE:.in=)

0 commit comments

Comments
 (0)