Wpis z mikrobloga

#docker #postgresql #devops

Robię sobie swój obraz Dockerowy na podstawie tego Postgresowego. Chcę go rozszerzyć o ściągnięcie moich danych i załadowanie do bazy (żeby potem każdy mógł łatwo odpalić bazę z moim datasetem). Mam już wszystkie skrypty itd.

Zrobiłem inicjowanie według tego: https://hub.docker.com/_/postgres#initialization-scripts
Tzn. podczas budowania obrazu (w Dockerfile) wrzucam do folderu /docker-entrypoint-initdb.d/ dwa pliki: skrypt, który zajmuje się ściągnięciem danych i SQL, która ładuje do bazy. Wszystko działa.

Jednak te skrypty uruchamiają się dopiero przy starcie kontenera (docker run), a nie przy budowaniu obrazu (docker build). Chciałbym, żeby było odwrotnie. Żeby przy budowaniu obrazu się ściągnęło (co będzie trwać długo), ale potem przy starcie, żeby było szybko (żeby każdy mógł na szybko usunąć kontener i uruchomić nowy).

Spytacie czemu nie napiszę sobie własnego Dockerfile z własnym entrypoint? Już próbowałem, ale twórcy tego obrazu Postgresowego zalecają tak jak zrobiłem wyżej. Jak próbuję nadpisać entrypoint, to nie mogę np. przekazać parametrów uruchomieniowych i w ogóle nie startuje Postgres (w ogóle kontener się wywala).
  • 6
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@mk321: Napisz właśny Dockerfile, nie używaj entry point,. Napisz własny skrypt który uruchamia bazę i wrzuca dane a potem zamyka bazę. Dodaj tej skrypt a potem uruchom go w RUN.
  • Odpowiedz
@wrzesien: dzięki!

Mogę do RUN wrzucić ściąganie plików. Ale ładowania do bazy nie mogę, bo przecież użytkownik podaje nazwę bazy, użytkownika i hasło dopiero podczas docker run. To we własnym skrypcie nie wiem jakim loginem i hasłem się połączyć (np. $POSTGRES_PASSWORD nie istnieje jeszcze w tym momencie).
  • Odpowiedz
@mk321: No niestety, jeśli dane muszą być w bazie to musi ona być zainicjalizowana na etapie budowy kontenera. Alertnatywnie, tylko ściągnij dane w RUN, a potem napisz skrypt który to ładuje i dodaj do tego folderu, aby się uruchomił przy pierwszym starcie.
  • Odpowiedz
@wrzesien: tak zrobię, w RUN ściągnę, a załaduję podczas startu.

Masz może pomysł jak najlepiej powiadomić użytkownika, że baza jeszcze nie jest gotowa, bo do niej ładuję dane? Bo jak jest etap docker build to użytkownik widzi, że coś się dzieje, mogę robić echo na ekran i czeka aż się skończy. A jak jest etap docker run to komenda wykonuje się natychmiastowo, a reszta dzieje się w tyle. Dopiero jak
  • Odpowiedz
@mk321: Ty chcesz podczas uruchamiania kontenera ciągnąć jakieś dane? Przecież to antypattern i nigdy nie powinno się tak robić. Powinieneś odpalać ściąganie danych podczas budowania obrazu, a nie podczas jego uruchamiania.
  • Odpowiedz
via Wykop Mobilny (Android)
  • 0
@yggdrasil: no właśnie miałem podczas uruchamiania kontenera i nie chciałem żeby tak było.

Teraz mam ściąganie danych podczas budowania obrazu. Ale ich ładownie do bazy (co też trwa długo) nadal mam podczas uruchamiania. I tego już nie wiem jak przenieść (bo nie mam nazwy bazy, usera, ani hasła podczas budowania).
  • Odpowiedz