#bash #docker #docker-compose #lua
Вопрос:
У меня есть проект, в котором есть файл docker-compose и файл Dockerfile. Проект открыт здесь GitHub
Я создаю демо-проект с:
- Траэфик
- Фырканье 3
- Манекен API NodeJS для тестирования
Проблема в том, что в моем файле Docker у меня есть такая команда для запуска на Snort
# Validates the configuration of Snort
RUN ${MY_PATH}/bin/snort -c /etc/snort/etc/snort.lua
# Runs Snort
CMD ["/usr/local/snort/bin/snort", "-i", "eth0", "-c", "/etc/snort/etc/snort.lua", "-A", "fast", "-s", "65535", "-k", "none"]
Когда я создаю проект, docker-compose build
команды выполняются нормально, а конфигурация проходит проверку.
Когда я запускаю docker-compose up
службу Snort, она не запускается со следующей ошибкой
❯ docker-compose up
Docker Compose is now in the Docker CLI, try `docker compose up`
Starting snort3demo_back-end_1 ... done
Starting traefik ... done
Recreating snort3demo_snort_1 ... done
Attaching to snort3demo_back-end_1, snort3demo_snort_1, traefik
snort_1 | ERROR: unknown option - /usr/local/snort/bin/snort
snort_1 | FATAL: see prior 1 errors
snort_1 | Fatal Error, Quitting..
back-end_1 | Server ready
snort3demo_snort_1 exited with code 1
traefik | time="2021-06-07T09:51:57Z" level=info msg="Configuration loaded from flags."
Это не запуск команды там, где у нас есть /usr/local/snort/bin/snort
, но когда я строю, проблем нет.
Я не знаю, в чем может быть проблема, и мое сочинение выглядит следующим образом
version: "3.8"
services:
snort:
cap_add:
- NET_ADMIN
image: demo-snort3
env_file:
- ./config.env
build:
context: ./
dockerfile: snort3.dockerfile
networks:
- "demo-net"
reverse-proxy:
image: "traefik:v2.4"
container_name: "traefik"
restart: always
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
ports:
- "80:80"
- "8080:8080"
networks:
- "demo-net"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
back-end:
image: demo-node
build:
context: ./
dockerfile: node.dockerfile
networks:
- "demo-net"
labels:
- "traefik.enable=true"
- "traefik.http.routers.backend.rule=Host(`demo-node.localhost`)"
- "traefik.http.routers.backend.entrypoints=web"
networks:
demo-net:
Есть какие-либо изменения, которые мне нужно выполнить в композиции, чтобы она работала правильно, или я допустил какую-либо другую ошибку.
По мере необходимости Dockerfile
FROM ubuntu:latest
## Install Dependencies
RUN apt-get update amp;amp; DEBIAN_FRONTEND=noninteractive apt-get install -yq
wget
build-essential
libpcap-dev
libpcre3-dev
libnet1-dev
zlib1g-dev
luajit
hwloc
libdnet-dev
libdumbnet-dev
bison
flex
liblzma-dev
openssl
libssl-dev
pkg-config
libhwloc-dev
cmake
cpputest
libsqlite3-dev
uuid-dev
libcmocka-dev
libnetfilter-queue-dev
libmnl-dev
autotools-dev
libluajit-5.1-dev
libunwind-dev
iproute2
net-tools
sudo
ethtool
libtool
git
autoconf
ragel
libboost-dev
libboost-all-dev
systemd
libcrypt-ssleay-perl
liblwp-useragent-determined-perl
amp;amp; apt-get clean amp;amp; rm -rf /var/cache/apt/*
# Define working directory.
WORKDIR /opt
# Safec for runtime bounds checks on certain legacy C-library calls
ENV SAFEC_VERSION 02092020
RUN wget https://github.com/rurban/safeclib/releases/download/v02092020/libsafec-${SAFEC_VERSION}.tar.gz
amp;amp; tar xvfz libsafec-${SAFEC_VERSION}.tar.gz
amp;amp; cd libsafec-${SAFEC_VERSION}.0-g6d921f
amp;amp; ./configure
amp;amp; make
amp;amp; sudo make install
# Hyperscan critical to Snort3 operations and performance
# uses to fast pattern matching
# dependencies: PCRE, gperftools, ragel, Boost C , flatbuffers, colm
ENV PCRE_VERSION 10.37
RUN wget https://ftp.pcre.org/pub/pcre/pcre2-${PCRE_VERSION}.tar.gz
amp;amp; tar xzvf pcre2-${PCRE_VERSION}.tar.gz
amp;amp; cd pcre2-${PCRE_VERSION}
amp;amp; ./configure amp;amp; make amp;amp; sudo make install
ENV GP_TOOLS_VERSION 2.9.1
RUN wget https://github.com/gperftools/gperftools/releases/download/gperftools-${GP_TOOLS_VERSION}/gperftools-${GP_TOOLS_VERSION}.tar.gz
amp;amp; tar xzvf gperftools-${GP_TOOLS_VERSION}.tar.gz
amp;amp; cd gperftools-${GP_TOOLS_VERSION}
amp;amp; ./configure amp;amp; make amp;amp; sudo make install
ENV HYPERSCAN_VESRSION 5.4.0-2
RUN wget https://launchpad.net/ubuntu/ archive/primary/ sourcefiles/hyperscan/5.4.0-2/hyperscan_5.4.0.orig.tar.gz
amp;amp; tar xvzf hyperscan_5.4.0.orig.tar.gz
amp;amp; mkdir hyperscan-${HYPERSCAN_VESRSION}-build
amp;amp; cd hyperscan-${HYPERSCAN_VESRSION}-build
amp;amp; cmake -DCMAKE_INSTALL_PREFIX=/usr/local ../hyperscan-5.4.0
amp;amp; make amp;amp; sudo make install
ENV FLATBUFFERS_VESRSION 2.0.0
RUN wget https://github.com/google/flatbuffers/archive/refs/tags/v${FLATBUFFERS_VESRSION}.tar.gz -O flatbuffers-v${FLATBUFFERS_VESRSION}.tar.gz
amp;amp; tar xvzf flatbuffers-v${FLATBUFFERS_VESRSION}.tar.gz
amp;amp; mkdir flatbuffers-build
amp;amp; cd flatbuffers-build
amp;amp; cmake ../flatbuffers-${FLATBUFFERS_VESRSION}
amp;amp; make amp;amp; sudo make install
# DAQ
ENV DAQ_VERSION 3.0.3
RUN wget https://github.com/snort3/libdaq/archive/refs/tags/v${DAQ_VERSION}.tar.gz
amp;amp; tar xvfz v${DAQ_VERSION}.tar.gz
amp;amp; cd libdaq-${DAQ_VERSION}
amp;amp; ./bootstrap
amp;amp; ./configure
amp;amp; make
amp;amp; make install
RUN ldconfig
# Snort 3.1.0
ENV MY_PATH=/usr/local/snort
ENV SNORT_VERSION 3.1.5.0
RUN wget https://github.com/snort3/snort3/archive/refs/tags/${SNORT_VERSION}.tar.gz
amp;amp; tar xvfz ${SNORT_VERSION}.tar.gz
amp;amp; cd snort3-${SNORT_VERSION}
amp;amp; ./configure_cmake.sh --prefix=${MY_PATH}
amp;amp; cd build
amp;amp; make -j $(nproc) install
RUN ldconfig
# OpenAppID - Device detection
ENV OPEN_APP_ID 17843
RUN wget https://www.snort.org/downloads/openappid/${OPEN_APP_ID} -O OpenAppId-${OPEN_APP_ID}.tgz
amp;amp; tar xvfz OpenAppId-${OPEN_APP_ID}.tgz
amp;amp; cp -R odp /usr/local/lib/
# For this to work you MUST have downloaded the snort3 subscribers ruleset.
# This has to be located in the directory we are currently in.
ENV SNORT_RULES_SNAPSHOT 3150
COPY snortrules-snapshot-${SNORT_RULES_SNAPSHOT} /opt/
COPY *.sh /opt
RUN mkdir -p /var/log/snort amp;amp;
mkdir -p /usr/local/lib/snort_dynamicrules amp;amp;
mkdir -p /etc/snort amp;amp;
mkdir -p /etc/snort/rules amp;amp;
mkdir -p /etc/snort/preproc_rules amp;amp;
mkdir -p /etc/snort/etc amp;amp;
cp -r /opt/rules /etc/snort amp;amp;
cp -r /opt/so_rules /etc/snort amp;amp;
cp -r /opt/etc /etc/snort amp;amp;
cp -r /opt/builtins /etc/snort amp;amp;
# Custom rules goes to local.rules
# Will be copied an external file to Docker
# COPY local.rules /etc/snort/rules/local.rules
touch /etc/snort/rules/local.rules amp;amp;
touch /etc/snort/rules/white_list.rules /etc/snort/rules/black_list.rules
# Pulledpork
RUN wget https://github.com/shirkdog/pulledpork/archive/master.tar.gz -O pulledpork-master.tar.gz
amp;amp; tar xzvf pulledpork-master.tar.gz
amp;amp; cd pulledpork-master
amp;amp; cp pulledpork.pl /usr/bin/
amp;amp; chmod 755 /usr/bin/pulledpork.pl
amp;amp; cp etc/* /etc/snort/
amp;amp; cpan install LWP::Protocol::https
amp;amp; cpan install Crypt::SSLeay
amp;amp; cpan Mozilla::CA IO::Socket::SSL
# Check Pulledpork was installed
RUN /usr/bin/pulledpork.pl -V amp;amp; sleep 15
# Pulledpork conf
COPY pulledpork.conf /etc/snort/pulledpork.conf
COPY disablesid.conf /etc/snort/disablesid.conf
# COPY local rules across
COPY /rules/local.rules /etc/snort/rules/local.rules
# Clean up APT when done.
RUN apt-get clean amp;amp; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
/opt/${SNORT_VERSION}.tar.gz /opt/v${DAQ_VERSION}.tar.gz
ENV INTERFACE 'eth0'
ENV LUA_PATH=${MY_PATH}/include/snort/lua/?.lua;;
ENV SNORT_LUA_PATH=${MY_PATH}/etc/snort
ENV PATH="/usr/local/snort/bin:$PATH"
RUN cd /usr/local/snort/bin/ amp;amp; ls -la amp;amp; sleep 30
# Network interface service --> Not working
# RUN ls -la /lib/systemd/system/ amp;amp; sleep 30
# COPY ethtool.service /lib/systemd/system/
# RUN sudo service enable --now ethtool
# amp;amp; sudo service ethtool start
# HOME_NET config --> chage this with the right IP adresses where snort should monitoring
ARG SNORT_HOME_NET="192.168.0.0/16,172.16.0.0/12,10.0.0.0/8,172.17.0.0/16"
RUN sed -i "s#^HOME_NET =.*#HOME_NET = '$SNORT_HOME_NET'#" /etc/snort/etc/snort.lua
# Validate an installation
RUN ${MY_PATH}/bin/snort -c /etc/snort/etc/snort.lua
RUN chmod a x /opt/*
# Add the script that allows the rules to be updated when the container is running
ARG PPORK_OINKCODE
RUN if [ ! -z $PPORK_OINKCODE ]; then bash update-rules.sh "$PPORK_OINKCODE"; fi
# Exposed port
EXPOSE 8080
# Let's run snort!
# CMD ["-i", "eth0"]
ENTRYPOINT ["/opt/entrypoint.sh"]
# CMD ["/usr/local/snort/bin/snort", "-d", "-i", "eth0", "-c", "/etc/snort/etc/snort.lua"]
CMD ["/usr/local/snort/bin/snort", "-i", "eth0", "-c", "/etc/snort/etc/snort.lua", "-A", "fast", "-s", "65535", "-k", "none"]
Комментарии:
1. Значение CMD, скорее всего, не является полной командой, выполняемой для запуска контейнера. Нам нужно просмотреть остальную часть файла Dockerfile, чтобы увидеть настройку ТОЧКИ входа.
2. @BMitch добавил файл dockerfile, пожалуйста, посмотрите
3. @BMitch также я поделился ссылкой на свой GitHub, так как это открытый проект, поэтому, пожалуйста, также загляните туда для получения более подробной информации
Ответ №1:
Ваша точка входа конфликтует с командой, которую вы хотите запустить:
ENTRYPOINT ["/opt/entrypoint.sh"]
CMD ["/usr/local/snort/bin/snort", "-i", "eth0", "-c", "/etc/snort/etc/snort.lua", "-A", "fast", "-s", "65535", "-k", "none"]
Они объединяются для выполнения следующих действий в качестве вашего контейнера:
/opt/entrypoint.sh /usr/local/snort/bin/snort -i eth0 -c /etc/snort/etc/snort.lua -A fast -s 65535 -k none
И поскольку ваша точка входа содержит:
#!/bin/sh
exec /usr/local/snort/bin/snort -c /etc/snort/etc/snort.lua "$@"
Это становится следующей командой для запуска:
/usr/local/snort/bin/snort -c /etc/snort/etc/snort.lua /usr/local/snort/bin/snort -i eth0 -c /etc/snort/etc/snort.lua -A fast -s 65535 -k none
Так что фырканье правильно, что он получает возможность /usr/local/snort/bin/snort
, с которой он не знает, что делать. Это происходит только при запуске контейнера, точка входа и CMD не выполняются при создании образа.
Чтобы исправить это, либо удалите ТОЧКУ входа, либо задайте для CMD только те значения, которые будут добавлены в конце этой команды exec.