Slimmed the image
All checks were successful
Publish FaceAI Container / publish (push) Successful in 2m54s
All checks were successful
Publish FaceAI Container / publish (push) Successful in 2m54s
This commit is contained in:
parent
8ac86ffe36
commit
cf316c8563
8 changed files with 34 additions and 22 deletions
|
|
@ -3,4 +3,4 @@
|
||||||
!faceai/**
|
!faceai/**
|
||||||
!bin/
|
!bin/
|
||||||
!bin/Face_Recognition_Unix/
|
!bin/Face_Recognition_Unix/
|
||||||
!bin/Face_Recognition_Unix/**
|
!bin/Face_Recognition_Unix/face_matcher
|
||||||
|
|
@ -13,9 +13,11 @@ on:
|
||||||
env:
|
env:
|
||||||
REGISTRY: ${{ vars.FORGEJO_REGISTRY }}
|
REGISTRY: ${{ vars.FORGEJO_REGISTRY }}
|
||||||
IMAGE_NAMESPACE: ${{ vars.IMAGE_NAMESPACE }}
|
IMAGE_NAMESPACE: ${{ vars.IMAGE_NAMESPACE }}
|
||||||
IMAGE_NAME: ${{ vars.IMAGE_NAME != '' && vars.IMAGE_NAME || 'faceai' }}
|
CLIENT_IMAGE_NAME: ${{ vars.IMAGE_NAME != '' && vars.IMAGE_NAME || 'faceai-client' }}
|
||||||
|
PROCESSOR_IMAGE_NAME: ${{ vars.PROCESSOR_IMAGE_NAME != '' && vars.PROCESSOR_IMAGE_NAME || 'faceai-processor' }}
|
||||||
BUILD_CONTEXT: .
|
BUILD_CONTEXT: .
|
||||||
DOCKERFILE_PATH: faceai/docker/Dockerfile
|
CLIENT_DOCKERFILE_PATH: faceai/docker/Dockerfile
|
||||||
|
PROCESSOR_DOCKERFILE_PATH: faceai/docker/processor.Dockerfile
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
publish:
|
publish:
|
||||||
|
|
@ -32,8 +34,10 @@ jobs:
|
||||||
set -eu
|
set -eu
|
||||||
if [ -z "${REGISTRY}" ]; then echo "vars.FORGEJO_REGISTRY is required"; exit 1; fi
|
if [ -z "${REGISTRY}" ]; then echo "vars.FORGEJO_REGISTRY is required"; exit 1; fi
|
||||||
if [ -z "${IMAGE_NAMESPACE}" ]; then echo "vars.IMAGE_NAMESPACE is required"; exit 1; fi
|
if [ -z "${IMAGE_NAMESPACE}" ]; then echo "vars.IMAGE_NAMESPACE is required"; exit 1; fi
|
||||||
if [ -z "${IMAGE_NAME}" ]; then echo "vars.IMAGE_NAME resolved to an empty value"; exit 1; fi
|
if [ -z "${CLIENT_IMAGE_NAME}" ]; then echo "client image name resolved to an empty value"; exit 1; fi
|
||||||
if [ ! -f "${DOCKERFILE_PATH}" ]; then echo "Dockerfile not found at ${DOCKERFILE_PATH}"; exit 1; fi
|
if [ -z "${PROCESSOR_IMAGE_NAME}" ]; then echo "processor image name resolved to an empty value"; exit 1; fi
|
||||||
|
if [ ! -f "${CLIENT_DOCKERFILE_PATH}" ]; then echo "Dockerfile not found at ${CLIENT_DOCKERFILE_PATH}"; exit 1; fi
|
||||||
|
if [ ! -f "${PROCESSOR_DOCKERFILE_PATH}" ]; then echo "Dockerfile not found at ${PROCESSOR_DOCKERFILE_PATH}"; exit 1; fi
|
||||||
if [ ! -f "faceai/package.json" ]; then echo "faceai/package.json is missing from the repository checkout"; exit 1; fi
|
if [ ! -f "faceai/package.json" ]; then echo "faceai/package.json is missing from the repository checkout"; exit 1; fi
|
||||||
if [ ! -f "bin/Face_Recognition_Unix/face_matcher" ]; then echo "bin/Face_Recognition_Unix/face_matcher is missing from the repository checkout"; exit 1; fi
|
if [ ! -f "bin/Face_Recognition_Unix/face_matcher" ]; then echo "bin/Face_Recognition_Unix/face_matcher is missing from the repository checkout"; exit 1; fi
|
||||||
|
|
||||||
|
|
@ -106,14 +110,27 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
echo "${{ secrets.FORGEJO_REGISTRY_TOKEN }}" | docker login "${REGISTRY}" -u "${{ secrets.FORGEJO_REGISTRY_USERNAME }}" --password-stdin
|
echo "${{ secrets.FORGEJO_REGISTRY_TOKEN }}" | docker login "${REGISTRY}" -u "${{ secrets.FORGEJO_REGISTRY_USERNAME }}" --password-stdin
|
||||||
|
|
||||||
- name: Build and push image
|
- name: Build and push client image
|
||||||
run: |
|
run: |
|
||||||
set -eu
|
set -eu
|
||||||
IMAGE_REF="${REGISTRY}/${IMAGE_NAMESPACE}/${IMAGE_NAME}"
|
IMAGE_REF="${REGISTRY}/${IMAGE_NAMESPACE}/${CLIENT_IMAGE_NAME}"
|
||||||
SHORT_SHA="$(echo "${GITHUB_SHA}" | cut -c1-12)"
|
SHORT_SHA="$(echo "${GITHUB_SHA}" | cut -c1-12)"
|
||||||
docker buildx build \
|
docker buildx build \
|
||||||
--builder forgejo-builder \
|
--builder forgejo-builder \
|
||||||
--file "${DOCKERFILE_PATH}" \
|
--file "${CLIENT_DOCKERFILE_PATH}" \
|
||||||
|
--tag "${IMAGE_REF}:sha-${SHORT_SHA}" \
|
||||||
|
--tag "${IMAGE_REF}:latest" \
|
||||||
|
--push \
|
||||||
|
"${BUILD_CONTEXT}"
|
||||||
|
|
||||||
|
- name: Build and push processor image
|
||||||
|
run: |
|
||||||
|
set -eu
|
||||||
|
IMAGE_REF="${REGISTRY}/${IMAGE_NAMESPACE}/${PROCESSOR_IMAGE_NAME}"
|
||||||
|
SHORT_SHA="$(echo "${GITHUB_SHA}" | cut -c1-12)"
|
||||||
|
docker buildx build \
|
||||||
|
--builder forgejo-builder \
|
||||||
|
--file "${PROCESSOR_DOCKERFILE_PATH}" \
|
||||||
--tag "${IMAGE_REF}:sha-${SHORT_SHA}" \
|
--tag "${IMAGE_REF}:sha-${SHORT_SHA}" \
|
||||||
--tag "${IMAGE_REF}:latest" \
|
--tag "${IMAGE_REF}:latest" \
|
||||||
--push \
|
--push \
|
||||||
|
|
|
||||||
|
|
@ -79,7 +79,7 @@ The local stack also mounts:
|
||||||
- `./logs` into both the public FaceAI container and the processor container as the persistent diagnostics directory
|
- `./logs` into both the public FaceAI container and the processor container as the persistent diagnostics directory
|
||||||
- `../www` into the PHP container so the real bridge files are used
|
- `../www` into the PHP container so the real bridge files are used
|
||||||
|
|
||||||
The `processor` service is built from `docker/processor.Dockerfile` using the repository root as Docker build context. That image copies the checked-in `bin/Face_Recognition_Unix` directory into `/opt/face-recognition` during `docker build`, so the matcher binary is baked into the image instead of being mounted from the host at runtime.
|
The `processor` service is built from `docker/processor.Dockerfile` using the repository root as Docker build context. That image copies only the checked-in Unix `face_matcher` into the image, so the matcher is baked into the processor runtime without bringing along the other Unix or Windows binaries.
|
||||||
|
|
||||||
### Persistent Logs
|
### Persistent Logs
|
||||||
|
|
||||||
|
|
@ -219,9 +219,9 @@ When enabled, the live suite also:
|
||||||
|
|
||||||
If the processor logs show an error like `spawn /opt/face-recognition/face_matcher ENOENT`, the problem is not the upload flow itself. It means the running processor cannot see the matcher binary at the configured `FACEAI_MATCHER_BINARY` path.
|
If the processor logs show an error like `spawn /opt/face-recognition/face_matcher ENOENT`, the problem is not the upload flow itself. It means the running processor cannot see the matcher binary at the configured `FACEAI_MATCHER_BINARY` path.
|
||||||
|
|
||||||
With the current checked-in Dockerfiles, the matcher binary is copied into the image from the repository source tree during `docker build`. The runtime container no longer needs a host bind mount for `/opt/face-recognition`.
|
With the current checked-in Dockerfiles, only the Unix `face_matcher` is copied into the processor image from the repository source tree during `docker build`. The runtime container no longer needs a host bind mount for `/opt/face-recognition`.
|
||||||
|
|
||||||
Published images now get that binary because the Forgejo container workflow builds from the repository root, which lets `faceai/docker/Dockerfile` copy:
|
Published images now get that binary because the Forgejo container workflow builds a dedicated processor image from the repository root, which lets `faceai/docker/processor.Dockerfile` copy:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
bin/Face_Recognition_Unix/face_matcher
|
bin/Face_Recognition_Unix/face_matcher
|
||||||
|
|
@ -309,7 +309,7 @@ services:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
|
|
||||||
processor:
|
processor:
|
||||||
image: forgejo.maddoscientisto.net/maddo/faceai-client:latest
|
image: forgejo.maddoscientisto.net/maddo/faceai-processor:latest
|
||||||
container_name: regalami-faceai-processor
|
container_name: regalami-faceai-processor
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
command:
|
command:
|
||||||
|
|
@ -384,7 +384,7 @@ Processor settings:
|
||||||
| Variable | Required | Example | Purpose |
|
| Variable | Required | Example | Purpose |
|
||||||
| --- | --- | --- | --- |
|
| --- | --- | --- | --- |
|
||||||
| `FACEAI_PKL_ROOT` | yes | `/data/pkl` | mounted race-to-PKL dataset root |
|
| `FACEAI_PKL_ROOT` | yes | `/data/pkl` | mounted race-to-PKL dataset root |
|
||||||
| `FACEAI_MATCHER_BINARY` | yes | `/opt/face-recognition/face_matcher` | matcher executable baked into the image |
|
| `FACEAI_MATCHER_BINARY` | yes | `/opt/face-recognition/face_matcher` | matcher executable baked into the processor image |
|
||||||
| `FACEAI_WORKER_CONCURRENCY` | optional | `2` | BullMQ worker concurrency |
|
| `FACEAI_WORKER_CONCURRENCY` | optional | `2` | BullMQ worker concurrency |
|
||||||
| `FACEAI_WORKER_TIMEOUT_MS` | optional | `300000` | matcher timeout in milliseconds |
|
| `FACEAI_WORKER_TIMEOUT_MS` | optional | `300000` | matcher timeout in milliseconds |
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ export async function runFaceMatcher({ matcherBinary, selfiePath, pklPath, csvPa
|
||||||
child.on('error', (error) => {
|
child.on('error', (error) => {
|
||||||
clearTimeout(timer);
|
clearTimeout(timer);
|
||||||
if (error?.code === 'ENOENT') {
|
if (error?.code === 'ENOENT') {
|
||||||
reject(new Error(`face_matcher not found at ${matcherBinary}. Check FACEAI_MATCHER_BINARY and the processor bind mount.`));
|
reject(new Error(`face_matcher not found at ${matcherBinary}. Check FACEAI_MATCHER_BINARY or the bundled Unix matcher binary in the processor image.`));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
reject(error);
|
reject(error);
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ async function ensureMatcherBinaryAvailable() {
|
||||||
await fs.access(config.matcherBinary, fsConstants.X_OK);
|
await fs.access(config.matcherBinary, fsConstants.X_OK);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`FaceAI processor cannot start because the matcher binary is unavailable: ${config.matcherBinary}`);
|
console.error(`FaceAI processor cannot start because the matcher binary is unavailable: ${config.matcherBinary}`);
|
||||||
console.error('Ensure FACEAI_MATCHER_BINARY points to a real executable and that the processor bind mount contains face_matcher.');
|
console.error('Ensure FACEAI_MATCHER_BINARY points to a real executable and that the processor image includes the Unix face_matcher binary.');
|
||||||
if (error?.code === 'ENOENT') {
|
if (error?.code === 'ENOENT') {
|
||||||
console.error('The configured matcher path does not exist inside the processor runtime.');
|
console.error('The configured matcher path does not exist inside the processor runtime.');
|
||||||
} else if (error?.code === 'EACCES') {
|
} else if (error?.code === 'EACCES') {
|
||||||
|
|
|
||||||
|
|
@ -15,9 +15,6 @@ COPY faceai/apps/processor/package.json apps/processor/package.json
|
||||||
RUN npm install
|
RUN npm install
|
||||||
|
|
||||||
COPY faceai/ .
|
COPY faceai/ .
|
||||||
COPY bin/Face_Recognition_Unix /opt/face-recognition
|
|
||||||
|
|
||||||
RUN chmod +x /opt/face-recognition/face_matcher
|
|
||||||
|
|
||||||
RUN npm run build
|
RUN npm run build
|
||||||
|
|
||||||
|
|
@ -31,10 +28,8 @@ RUN apt-get update \
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
COPY --from=build /app /app
|
COPY --from=build /app /app
|
||||||
COPY --from=build /opt/face-recognition /opt/face-recognition
|
|
||||||
|
|
||||||
ENV NODE_ENV=production
|
ENV NODE_ENV=production
|
||||||
ENV FACEAI_MATCHER_BINARY=/opt/face-recognition/face_matcher
|
|
||||||
EXPOSE 3001
|
EXPOSE 3001
|
||||||
|
|
||||||
CMD ["npm", "run", "start"]
|
CMD ["npm", "run", "start"]
|
||||||
|
|
@ -8,7 +8,7 @@ RUN apt-get update \
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
COPY faceai /app
|
COPY faceai /app
|
||||||
COPY bin/Face_Recognition_Unix /opt/face-recognition
|
COPY bin/Face_Recognition_Unix/face_matcher /opt/face-recognition/face_matcher
|
||||||
|
|
||||||
RUN chmod +x /opt/face-recognition/face_matcher
|
RUN chmod +x /opt/face-recognition/face_matcher
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ services:
|
||||||
- redis
|
- redis
|
||||||
|
|
||||||
processor:
|
processor:
|
||||||
image: forgejo.maddoscientisto.net/maddo/faceai-client:latest
|
image: forgejo.maddoscientisto.net/maddo/faceai-processor:latest
|
||||||
container_name: regalami-faceai-processor
|
container_name: regalami-faceai-processor
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
command: sh -c "mkdir -p /data/logs && npm run start:processor >> /data/logs/processor.log 2>&1"
|
command: sh -c "mkdir -p /data/logs && npm run start:processor >> /data/logs/processor.log 2>&1"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue