# ab_server container for the AB CIP integration suite. # # ab_server is a C program in libplctag/libplctag under src/tools/ab_server. # We clone at a pinned commit, build just the ab_server target via CMake, # and copy the resulting binary into a slim runtime stage so the published # image stays small (~60MB vs ~350MB for the build stage). # -------- stage 1: build ab_server from source -------- FROM debian:bookworm-slim AS build RUN apt-get update && apt-get install -y --no-install-recommends \ git \ build-essential \ cmake \ ca-certificates \ && rm -rf /var/lib/apt/lists/* # A concrete tag, not a branch. This said "pinned" while cloning `release`, # which moves — so two builds of the same Dockerfile could produce different # servers, and the patch below could not be relied on to apply. Bump # deliberately alongside a driver-side change that needs something newer, and # re-check the patch against the new tag. ARG LIBPLCTAG_TAG=v2.7.0 RUN git clone --depth 1 --branch "${LIBPLCTAG_TAG}" https://github.com/libplctag/libplctag.git /src # Upstream ab_server answers CIP service 0x55 (Get Instance Attribute List) with # "unsupported", so a controller-tag browse against it returns nothing. The # patch implements the Symbol Object listing that a real Logix controller # serves, which is what the AbCip driver's `@tags` walk reads. Verified against # libplctag's own `list_tags_logix` client — see README.md. COPY patches/ /patches/ WORKDIR /src RUN git apply --verbose /patches/*.patch RUN cmake -S . -B build -DCMAKE_BUILD_TYPE=Release \ && cmake --build build --target ab_server --parallel # -------- stage 2: runtime -------- FROM debian:bookworm-slim LABEL org.opencontainers.image.source="https://github.com/dohertj2/lmxopcua" \ org.opencontainers.image.description="libplctag ab_server for OtOpcUa AB CIP driver integration tests" # libplctag's ab_server is statically linked against libc / libstdc++ on # Debian bookworm; no runtime dependencies beyond what the slim image # already has. COPY --from=build /src/build/bin_dist/ab_server /usr/local/bin/ab_server EXPOSE 44818 # docker-compose.yml overrides the command with per-family flags. CMD ["ab_server", "--plc=ControlLogix", "--path=1,0", "--port=44818", \ "--tag=TestDINT:DINT[1]", "--tag=TestREAL:REAL[1]", "--tag=TestBOOL:BOOL[1]"]