1. Konfiguracja środowiska
Na początku, należy upewnić się, że mamy dostępne narzędzie Docker.
Przykłady w tutorialu będą zakładały, że wykonujemy je w środowisku Linux ($ na początku przykładu oznacza, że jest to
komenda to wykonania w terminalu bash).
W środowisku Windows możemy użyć WSL2 lub użyć alternatywnych narzędzi które wykonują to samo zadanie co przedstawione przykłady.
Utworzenie projektu
Pracę zaczynamy w dowolnie wybranym pustym folderze.
trapdef.json
Tworzymy tam plik trapdef.json z następującą zawartością:
{
"$schema": "https://raw.githubusercontent.com/TrapTech/trapdef-schema/main/TrapDef.schema.json",
"def": "1.0",
"private": true,
"name": "My tutorial trap",
"identifier": "my-tutorial-trap",
"authors": ["Me :)"],
"version": "0.0.1",
"supportedRunners": ["Docker"],
"dockerRunnerDefinition": {
"dockerComposePath": "./docker-compose.yml",
"imagesPath": "./images.tar"
}
}
O możliwej zawartości trapdef.json możesz przeczytać więcej tutaj.
docker-compose.yml
Następnie tworzymy w folderze plik docker-compose.yml, który będzie określał, jak uruchomić naszą pułapkę.
version: "3.1"
services:
trap:
image: my-tutorial-trap
build: .
ports:
- ${TRAP_EXPOSE_PORT}:80
environment:
- TRAP_LOG_ENDPOINT
- TRAP_LOG_TOKEN
- TRAPCLI_DISABLE_SSL_VALIDATION
Zauważ, że w pliku trapdef.json ścieżka do tego pliku (w stosunku do trapdef.json) jest określona w polu dockerComposePath.
Tworzona pułapka będzie uruchamiała tylko jeden kontener, ale pamiętaj że można tutaj zdefiniowac wiele kontenerów do uruchomienia - jeśli np. nasza pułapka potrzebuje bazy danych MySQL, możemy ją uruchomić jako dodatkowy kontener.
docker-compose.yml jest definicją używaną przez narzędzie
docker compose, i w pułapkach TrapInit jest używana
analogicznie - tzn. uruchomienie pułapki na podstawie definicji wykonuje takie
same operacje jak docker-compose up.
Dockerfile
Pułapki TrapInit są uruchamiane jako obrazy Docker. Aby więc zbudować obraz naszej pułapki, musimy go zdefiniować za
pomocą Dockerfile.
Ten tutorial zakłada już podstawową znajomość narzędzia Docker. Jeśli chcesz dowiedzieć się więcej na temat tego narzędzia, sprawdź dokumentację Docker'a.
Nasza pułapka będzie napisana w języku Python, dlatego też tworzony Dockerfile jest dostosowany dla aplikacji Python.
Należy także zwrócić uwagę, że instalowane jest narzędzie TrapCLI, zgodnie z przykładem.
Utwórz w folderze definicji plik Dockerfile z następującą zawartością:
FROM curlimages/curl as trapcli
# Download and install TrapCLI
ARG TRAPCLI_VERSION=1.2.2
RUN curl -f https://downloads.traptech.pl/data/TrapCLI-musl-v${TRAPCLI_VERSION} -o /home/curl_user/TrapCLI \
&& chmod +x /home/curl_user/TrapCLI
FROM python:3.10-alpine
WORKDIR /app
COPY requirements.txt /app
RUN pip install -r requirements.txt
# These packages are needed on alpine to run TrapCLI
RUN apk add ca-certificates zlib libgcc libstdc++
COPY /home/curl_user/TrapCLI /usr/bin/TrapCLI
COPY app.py /app
EXPOSE 80
# Run TrapCLI as a background process (necessary for health ping and certain functions),
# and the python trap as a foreground process.
CMD TrapCLI daemon & python app.py
Ten plik nie jest określony w trapdef.json i nie będziemy go zawierać w końcowej paczce pułapki. To dlatego, że
zamiast tego będziemy dodawać do paczki zbudowane obrazy.
Mamy już wszystko potrzebne do rozpoczęcia pracy. Aktualnie nie jesteśmy w stanie zbudować pułapki, ponieważ brakuje wymaganego kodu źródłowego. Pisanie logiki pułapki rozpoczniemy w następnym etapie.