Mam 2 obrazy na Docker Hub. Jeden do API a drugi do bazy (Spring Boot i Postgres)
Chciałbym odpalić je w Docker Desktop jako jeden kontener, tak jakby ktoś odpalał na innym komputerze, ale niestety nie wiem, jak to zrobić.
Tutaj dokłady opis problemu na Stacku:
https://stackoverflow.com/questions/76686711/using-pulled-docker-image-postgres-error-spring-boot-postgres
Najlepiej to napisz do tego jakiś docker-compose tworząc tam referencje do tych dwóch obrazów, później budując tego compose'a zaciągnie Ci te dwa obrazy i je uruchomi (o ile poprawnie je skonfigurujesz)
Escanor16 napisał(a):
Najlepiej to napisz do tego jakiś docker-compose tworząc tam referencje do tych dwóch obrazów, później budując tego compose'a zaciągnie Ci te dwa obrazy i je uruchomi (o ile poprawnie je skonfigurujesz)
Mam docker compose:
version: "3"
services:
api:
image: api
environment:
- SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/CinemaDb
- SPRING_DATASOURCE_USERNAME=postgres
- SPRING_DATASOURCE_PASSWORD=12345
- SPRING_JPA_HIBERNATE_DDL_AUTO=create
- SPRING_LIQUIBASE_ENABLED=false
build:
context: ./
dockerfile: Dockerfile
ports:
- "8080:8080"
depends_on:
- db
db:
image: postgres
ports:
- "5432:5432"
environment:
- POSTGRES_DB=CinemaDb
- POSTGRES_USE=postgres
- POSTGRES_PASSWORD=12345
@Escanor16:
Zmieniłem na coś takiego, ale wtedy pushuje tylko api a db jest skipped
version: "3"
services:
api:
image: nofenak/my-images:cinema-api
environment:
- SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/CinemaDb
- SPRING_DATASOURCE_USERNAME=postgres
- SPRING_DATASOURCE_PASSWORD=12345
- SPRING_JPA_HIBERNATE_DDL_AUTO=create
- SPRING_LIQUIBASE_ENABLED=false
build:
context: ./
dockerfile: Dockerfile
ports:
- "8080:8080"
depends_on:
- db
db:
image: postgres
ports:
- "5432:5432"
environment:
- POSTGRES_DB=CinemaDb
- POSTGRES_USE=postgres
- POSTGRES_PASSWORD=12345
Masz literówke w POSTGRES_USER
Black007 napisał(a):
Masz literówke w POSTGRES_USER
Poprawiłem, ale nadal nie wiem, jak to odpalić po pobraniu z Docker Hub, tak, żeby to działało
To właściwie niweluje cały sens kontenerów.
Jeśli chcesz żeby te rzeczy się widziały "tak jakby były razem" to nie ma sensu żeby były oddzielnymi kontenerami.
Riddle napisał(a):
To właściwie niweluje cały sens kontenerów.
Jeśli chcesz żeby te rzeczy się widziały "tak jakby były razem" to nie ma sensu żeby były oddzielnymi kontenerami.
To jak spakować api i db do jednego obrazu?
Ogólnie chodzi mi o taki efekt, żeby ktoś pobrał sobie taki obrazł i potem mógł wejść pod localhost:8080/swagger-ui i użyć api
Nofenak napisał(a):
Riddle napisał(a):
To właściwie niweluje cały sens kontenerów.
Jeśli chcesz żeby te rzeczy się widziały "tak jakby były razem" to nie ma sensu żeby były oddzielnymi kontenerami.
To jak spakować api i db do jednego obrazu?
Ogólnie chodzi mi o taki efekt, żeby ktoś pobrał sobie taki obrazł i potem mógł wejść pod localhost:8080/swagger-ui i użyć api
No normalnie.
Piszesz Dockerfile
który ma w sobie bazę i api i tyle.
Zrób np
FROM postgres
ADD src/ # Twoja apka
Riddle napisał(a):
Nofenak napisał(a):
Riddle napisał(a):
To właściwie niweluje cały sens kontenerów.
Jeśli chcesz żeby te rzeczy się widziały "tak jakby były razem" to nie ma sensu żeby były oddzielnymi kontenerami.
To jak spakować api i db do jednego obrazu?
Ogólnie chodzi mi o taki efekt, żeby ktoś pobrał sobie taki obrazł i potem mógł wejść pod localhost:8080/swagger-ui i użyć apiNo normalnie.
Piszesz
Dockerfile
który ma w sobie bazę i api i tyle.
A nie Docker compose? Mógłbyś dać jakiś przykład?
Nofenak napisał(a):
Riddle napisał(a):
Nofenak napisał(a):
Riddle napisał(a):
To właściwie niweluje cały sens kontenerów.
Jeśli chcesz żeby te rzeczy się widziały "tak jakby były razem" to nie ma sensu żeby były oddzielnymi kontenerami.
To jak spakować api i db do jednego obrazu?
Ogólnie chodzi mi o taki efekt, żeby ktoś pobrał sobie taki obrazł i potem mógł wejść pod localhost:8080/swagger-ui i użyć apiNo normalnie.
Piszesz
Dockerfile
który ma w sobie bazę i api i tyle.A nie Docker compose? Mógłbyś dać jakiś przykład?
Nie, bo jak zrobisz docker-compose to będziesz miał dwa kontenery.
Riddle napisał(a):
Nofenak napisał(a):
Riddle napisał(a):
Nofenak napisał(a):
Riddle napisał(a):
To właściwie niweluje cały sens kontenerów.
Jeśli chcesz żeby te rzeczy się widziały "tak jakby były razem" to nie ma sensu żeby były oddzielnymi kontenerami.
To jak spakować api i db do jednego obrazu?
Ogólnie chodzi mi o taki efekt, żeby ktoś pobrał sobie taki obrazł i potem mógł wejść pod localhost:8080/swagger-ui i użyć apiNo normalnie.
Piszesz
Dockerfile
który ma w sobie bazę i api i tyle.A nie Docker compose? Mógłbyś dać jakiś przykład?
Nie, bo jak zrobisz docker-compose to będziesz miał dwa kontenery.
A to dlaczego w praktycznie każdym poradniku jest docker-compose?
Nofenak napisał(a):.
A to dlaczego w praktycznie każdym poradniku jest docker-compose?
Poradniki zalecają budowanie wielu kontenerów, ale to nie jest coś co próbujesz zrobić.
Z tego co mówisz, to chcesz żeby dało się zrobić coś w stylu docker run moj_suoer_obraz
i żeby mógł wejść na port. Jeśli tak, to musi to być jeden kontener.
Chyba że nie chcesz tego tak zrobić? Jeśli koniecznie chciałbyś użyć docker compose to ktoś musiałby ściągnąć dwa obrazy (a nie jeden), albo musiałbyś im dać dostęp do kodu źródłowego żeby sobie sami je zbudowali.
Dużo by pomogło gdybyś po prostu od początku do końca napisał co chcesz zrobić, bo to nadal nie jest jasne.
@Riddle:
Chciałbym, żeby ktoś mógł pobrać sobie obraz mojej apki, odpalić go i użyć API przez Swaggera (prosty crud z dostępem do bazy)
Mam podobny case, mam apkę, która korzysta z postgresa, mam to na githubie, i jak ktoś chce odpalić to ściąga docker-compose.yml z tego repo https://github.com/bartgora/Mockify/blob/master/docker-compose.yml
Nofenak napisał(a):
@Riddle:
Chciałbym, żeby ktoś mógł pobrać sobie obraz mojej apki, odpalić go i użyć API przez Swaggera (prosty crud z dostępem do bazy)
No to w takim razie na 100% to musi być jeden kontener, ergo jeden Dockerfile
i bez docker-compose.
Wtedy będziesz mógł ją odpalić np tak:
docker run --rm -p 8080:80 moj_super_obraz
Nie rozumiem po co chcesz to pakowac w jeden kontener. Tak jak masz teraz to uzytkownik sobie pobiera twoj docker compose. Odpala go. Wchodzi na tego swaggera i wszystko gra i buczy a docker compose juz zadba zeby odpowiednio odpalic apke i baze danych itd
Jeśli zależy Ci na nie używaniu docker compose, to możesz użyć jakiejś bazy danych in-memory np h2
Tak patrze na stackoverflow. Nie masz po prostu bledu spowodowanego tym ze apka podnosi sie szybciej od bazy danych która nie jest jeszcze w stanie obsluzyc ruchu i dlatego sie wywala. Tj . Odpali sie kontener z baza danych i zaczyna podnosic baze w momencie jak sie odpali to od razu odpala sie apka ktora startuje szybciej bo jest mniejsza? (w docker compose "healthcheck") w googlach wyszukasz co i jak
Black007 napisał(a):
Mam podobny case, mam apkę, która korzysta z postgresa, mam to na githubie, i jak ktoś chce odpalić to ściąga docker-compose.yml z tego repo https://github.com/bartgora/Mockify/blob/master/docker-compose.yml
Jak wchodzę na Swaggera, to mam biały ekran
w na jaki url wchodzisz? http://localhost:8080/swagger-ui/index.html u mnie działa
docker-compose up -d
@Black007: Finalnie, twoje rozwiązanie okazało się najlepsze, dzięki
Kompletnie zamotałeś i na mój gust źle opisałeś zadanie.
Jak rozumiem jeden obraz to twoja aplikacja a drugi to co? Goły kontener z postgresem? Jakaś Twoja customowa aplikacja z postgresem?
Mam wrażenie, że ta ostatnia opcja więc pytanie po co? Czemu nie skonfigurowałeś w docker compose obrazu ze swoją aplikacją i osobnego obrazu (np. oficjalnego) z postgresem i nie skonfigurowałeś compose'a tak aby twoja apka czekała aż wstanie baza i z niej korzystała?
Z prostego problemu zrobiłeś wątek na 3 strony ;)