Skip to content

Commit

Permalink
Merge pull request #353 from mtconnect/reduce_docker_image_size
Browse files Browse the repository at this point in the history
Reduced image size for demo and builds
  • Loading branch information
wsobel authored Oct 21, 2023
2 parents 1a2de47 + 57d432e commit d3eec2c
Show file tree
Hide file tree
Showing 16 changed files with 282 additions and 634 deletions.
13 changes: 9 additions & 4 deletions .github/workflows/build-docker-image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,12 @@ jobs:
# the type of runner that the job will run on
runs-on: ubuntu-latest
strategy:
max-parallel: 1
matrix:
include:
include:
- dockerfile: docker/alpine/Dockerfile
name: agent
- dockerfile: demo/Dockerfile.alpine
- dockerfile: demo/Dockerfile
name: demo

# steps represent a sequence of tasks that will be executed as part of the job
Expand All @@ -63,7 +64,11 @@ jobs:
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}


- name: Remove leading v from the version
run: |
echo "VERSION=$(echo ${{ github.ref_name }} | sed 's/^v//')" >> $GITHUB_ENV
# see https://github.com/docker/build-push-action
- name: Build image and push to DockerHub
uses: docker/build-push-action@v5
Expand All @@ -75,7 +80,7 @@ jobs:
# docker hub user/repo:tag
tags: |
${{ secrets.DOCKERHUB_USERNAME }}/${{ matrix.name }}:latest
${{ secrets.DOCKERHUB_USERNAME }}/${{ matrix.name }}:${{ github.ref_name }}
${{ secrets.DOCKERHUB_USERNAME }}/${{ matrix.name }}:${{ env.VERSION }}
# push to docker hub
push: true
176 changes: 29 additions & 147 deletions demo/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -10,193 +10,75 @@
#
# docker buildx build \
# --platform linux/amd64,linux/arm64 \
# --tag mtconnect/agent:2.0.0.12_RC18 \
# --tag mtconnect/demo:latest \
# --push \
# -f demo/Dockerfile
# .
#
# To run tests, use `--build-arg WITH_TESTS=true`
#
# # Note: In this case, I would suggest to map port `5000` to `5000`. The user can always change the port according to their needs.
# docker run -it --rm --init --name agent -p5000:5000 \
# mtconnect/agent:2.0.0.12_RC18
# docker run -it --rm --init --name agent -p5000:5000 mtconnect/demo
#
# then visit http://localhost:5000 to see the demo output.

# ---------------------------------------------------------------------
# os
# Use the mtconnect/agent base image
# ---------------------------------------------------------------------

# base image - ubuntu has amd64, arm64 etc.
# 22.04 is the current long term support release, maintained until 2025-04.
FROM ubuntu:22.04 AS os

# tzinfo hangs without this
ARG DEBIAN_FRONTEND='noninteractive'

# ---------------------------------------------------------------------
# build
# ---------------------------------------------------------------------

FROM os AS build

# limit cpus so don't run out of memory on local machine
# symptom: get error - "c++: fatal error: Killed signal terminated program cc1plus"
# can turn off if building in cloud
ARG CONAN_CPU_COUNT=2

ARG WITH_RUBY='True'

# set some variables
ENV PATH="$HOME/venv3.9/bin:$PATH"
ENV CONAN_PROFILE='conan/profiles/docker'

# update os and add dependencies
# note: Dockerfiles run as root by default, so don't need sudo
RUN apt-get update \
&& apt-get install -y \
autoconf \
automake \
build-essential \
cmake \
git \
python3 \
python3-pip \
rake \
ruby \
&& rm -rf /var/lib/apt/lists/* \
&& pip install conan -v 'conan==2.0.9'

# make an agent directory and cd into it
WORKDIR /root/agent

# bring in the repo contents, minus .dockerignore files
COPY . .

ARG WITH_TESTS=false
ARG WITH_TESTS_ARG=argument
ARG SHARED=False

# Build and optionally test
RUN if [ -z "$WITH_TESTS" ] || [ "$WITH_TESTS" = "false" ]; then \
WITH_TESTS_ARG="--test-folder="; \
else \
WITH_TESTS_ARG=""; \
fi \
&& conan profile detect \
&& conan create . \
--build=missing \
-c "tools.build:jobs=$CONAN_CPU_COUNT" \
-o agent_prefix=mtc \
-o cpack=True \
-o "with_ruby=$WITH_RUBY" \
-o cpack_destination=/root/agent \
-o cpack_name=dist \
-o cpack_generator=TGZ \
-pr "$CONAN_PROFILE" \
${WITH_TESTS_ARG}

# ---------------------------------------------------------------------
# release
# ---------------------------------------------------------------------

FROM os AS release
FROM mtconnect/agent as mtconnect

# TODO: How about shortening the description to MTConnect Agent or at least MTConnect C++ Agent?
LABEL author='mtconnect' description='MTConnect C++ Agent'

ARG BIN_DIR='/usr/local/bin'
ARG LIB_DIR='/usr/local/lib'

ARG MTCONNECT_CONF_DIR='/etc/mtconnect'
ARG MTCONNECT_DATA_DIR='/usr/local/share/mtconnect'
ARG MTCONNECT_LOG_DIR='/var/log/mtconnect'
LABEL author='mtconnect' description='MTConnect C++ Agent Demo'

ENV MTCONNECT_CONF_DIR="$MTCONNECT_CONF_DIR"
ENV MTCONNECT_DATA_DIR="$MTCONNECT_DATA_DIR"
ENV MTCONNECT_LOG_DIR="$MTCONNECT_LOG_DIR"
ENV DEMO_DIR="$MTCONNECT_DATA_DIR/demo"

# install ruby for simulator
RUN apt-get update \
&& apt-get install -y ruby
USER root

# change to a new non-root user for better security.
# this also adds the user to a group with the same name.
# -m creates a home folder, ie /home/<username>
ARG UID=1000
ARG GID=1000
RUN apk add ruby

RUN groupadd \
--gid $GID \
agent \
&& useradd \
--create-home \
--uid $UID \
--gid $GID \
agent
COPY --chown=agent:agent \
./simulator/* \
/mtconnect/data/simulator/
COPY --chown=agent:agent \
./demo/ \
/mtconnect/data/demo/
COPY --chown=agent:agent \
./demo/agent/agent.dock \
./demo/agent/Devices.xml \
/mtconnect/config/

USER agent
WORKDIR /home/agent

# install agent executable
COPY --chown=agent:agent --from=build /root/agent/dist.tar.gz /home/agent/

# Extract the data
RUN tar xf dist.tar.gz \
&& rm dist.tar.gz

# Copy the agent binary and create folders used by the agent
USER root
RUN mkdir -p "$BIN_DIR" "$LIB_DIR" \
&& cp /home/agent/dist/bin/* "$BIN_DIR" \
&& cp /home/agent/dist/lib/* "$LIB_DIR" \
&& mkdir -p "$MTCONNECT_CONF_DIR" \
"$MTCONNECT_DATA_DIR" \
"$MTCONNECT_LOG_DIR" \
&& chown agent:agent "$MTCONNECT_CONF_DIR" \
"$MTCONNECT_DATA_DIR" \
"$MTCONNECT_LOG_DIR"

USER agent

# Copy the agent data
RUN cp -r /home/agent/dist/share/mtconnect/schemas \
/home/agent/dist/share/mtconnect/simulator \
/home/agent/dist/share/mtconnect/styles \
/home/agent/dist/share/mtconnect/demo \
"$MTCONNECT_DATA_DIR" \
&& cp /home/agent/dist/share/mtconnect/demo/agent/agent.dock "$MTCONNECT_CONF_DIR/agent.cfg" \
&& cp /home/agent/dist/share/mtconnect/demo/agent/Devices.xml "$MTCONNECT_CONF_DIR" \
&& rm -r /home/agent/dist

# expose port
EXPOSE 5000

# Allow the directories to be mounted
VOLUME ["/mtconnect/config", "/mtconnect/log", "/mtconnect/data"]

# default command - can override with docker run or docker-compose command.
# this runs the adapter simulator and the agent using the sample config file.
# note: must use shell form here instead of exec form, since we're running
# multiple statements using shell commands (& and &&).
# see https://stackoverflow.com/questions/46797348/docker-cmd-exec-form-for-multiple-command-execution
CMD /usr/bin/ruby "$MTCONNECT_DATA_DIR/simulator/run_scenario.rb" -p 7879 -l "$DEMO_DIR/agent/mazak.txt" \
& /usr/bin/ruby "$MTCONNECT_DATA_DIR/simulator/run_scenario.rb" -p 7878 -l "$DEMO_DIR/agent/okuma.txt" \
& mtcagent run

CMD /usr/bin/ruby /mtconnect/data/simulator/run_scenario.rb -p 7879 -l /mtconnect/data/demo/agent/mazak.txt \
& /usr/bin/ruby /mtconnect/data/simulator/run_scenario.rb -p 7878 -l /mtconnect/data/demo/agent/okuma.txt \
& mtcagent run /mtconnect/config/agent.dock

# ---------------------------------------------------------------------
# note
# ---------------------------------------------------------------------

# after setup, the dirs look like this -
#
# /usr/local/bin
# /usr/bin
# |-- agent - the cppagent application
#
# /etc/mtconnect - Configuration files agent.cfg and Devices.xml
# /mtconnect/config - Configuration files agent.cfg and Devices.xml
#
# /usr/local/share/mtconnect
# /mtconnect/data
# |-- schemas - xsd files
# |-- simulator - agent.cfg, simulator.rb, vmc-3axis.xml, log.txt
# |-- styles - styles.xsl, styles.css, favicon.ico, etc
#
# /home/agent - the user's directory
#
# /var/log/mtconnect - logging directory
# /mtconnect/log - logging directory
Loading

0 comments on commit d3eec2c

Please sign in to comment.