Punkt wejścia do kontenera dokera informuje demona docker, co należy uruchomić, aby "uruchomić" konkretny kontener. Zadajmy sobie pytania: "co kontener powinien uruchomić po uruchomieniu po raz drugi?" lub "co kontener powinien uruchomić po ponownym uruchomieniu?"
Prawdopodobnie to, co robisz, jest zgodne z tym samym podejściem, które stosujesz w przypadku mechanizmów "starej szkoły". Twój skrypt "instaluje" potrzebne skrypty, a uruchomisz aplikację jako usługę systemd/upstart, prawda? Jeśli to robisz, powinieneś zmienić to w bardziej "zderarchizowaną" definicję.
Punktem początkowym dla tego kontenera powinien być skrypt, który faktycznie uruchamia aplikację, zamiast konfigurowania. Powiedzmy, że musisz zainstalować java, aby móc uruchomić twoją aplikację. Więc w dockerfile skonfigurowaniu kontenera bazowego, aby zainstalować wszystkie potrzebne rzeczy jak:
FROM alpine:edge
RUN apk --update upgrade && apk add openjdk8-jre-base
RUN mkdir -p /opt/your_app/ && adduser -HD userapp
ADD target/your_app.jar /opt/your_app/your-app.jar
ADD scripts/init.sh /opt/your_app/init.sh
USER userapp
EXPOSE 8081
CMD ["/bin/bash", "/opt/your_app/init.sh"]
naszych kontenerach, w firmie, w której pracuję, przed uruchomieniem rzeczywistą aplikację w init.sh skryptu oni pobrać konfiguruje konsul (zamiast dostarczania punktu montowania i umieszczania konfiguracji wewnątrz hosta lub osadzania ich w kontenerze). Więc skrypt będzie wyglądać mniej więcej tak:
#!/bin/bash
echo "Downloading config from consul..."
confd -onetime -backend consul -node $CONSUL_URL -prefix /cfgs/$CONSUL_APP/$CONSUL_ENV_NAME
echo "Launching your-app..."
java -jar /opt/your_app/your-app.jar
Jedna rada, jaką mogę dać ci to (w moim bardzo krótkim doświadczenia w pracy z kontenerami) traktować swoje pojemniki tak, jakby były bezpaństwowcem, gdy są one zabezpieczony (wszystkie polecenia, które działają przed punktem wejścia).
Całkowicie zgadzam się na uznanie kontenerów za bezpaństwowców. Jeśli istnieją dane do zainicjowania, umieść je w woluminie. – BMitch
Bardzo chciałbym skorzystać z Twojej rady, ale to nie jest takie proste. Mam niewielki wpływ na zmiany w aplikacji i musiałem zmienić DUŻĘ, aby używać jej tak, jak opisałeś. Na przykład: za każdym razem, gdy kontener się uruchamia, skrypt inicjujący tworzy bazę danych dla aplikacji. Nie powinno się to zdarzyć, gdy kontener zostanie zrestartowany, ponieważ nadpisuje dane, które już tam są ... Niestety, bardzo trudno było nauczyć twórców aplikacji, jak korzystać z funkcji dokowania. Dlatego staram się, aby był dla nich wyjątkowo prosty. – christian
jak to zrobić? – StarWind0