Kontejner souborový systém je prázdný při nasazení k8s aplikace s Minikube

0

Otázka

Mám malé webové aplikace (Rails aplikaci s názvem sofia), že jsem nasazení místně s minikube.

Když jsem se vytvořit k8s zdroje a spustit můj nasazení, kontejnery neobsahují žádné soubory, které měly být zkopírovány v průběhu obraz procesu sestavení.

Tady je to, co dělám:

Dockerfile

Jako součást Dockerfile stavět, jsem zkopírujte obsah mé místní klonovaný repozitář do obrazu pracovní adresář:

RUN mkdir -p /app
WORKDIR /app

COPY . ./

(Old) docker-compose nastavení

Historicky použil jsem docker-compose soubor ke spuštění této aplikace a všechny jeho služby. Já mapě místní adresář, do kontejneru je pracovní adresář (viz volumes: níže). To je hezký pohodlí při práci na místě, protože všechny změny se projeví "žít" uvnitř kontejneru:

# docker-compose.yml
sofia:
    build:
      context: .
      args:
        RAILS_ENV: development
    environment:
      DATABASE_URL: postgres://postgres:sekrit@postgres/
    image: sofia/sofia:local
    ports:
      - # ...
    volumes:
      - .:/app  #<---- HERE

Stavební k8s resource file s kompose

Za účelem spuštění této o minikubePoužívám kompose nástroje Kubernetes, že samy poskytují s cílem změnit můj docker-compose soubor do k8s resource file, které mohou být konzumovány.

$ kompose convert --file docker-compose.yml --out k8s.yml --with-kompose-annotation=false
WARN Volume mount on the host "/Users/jeeves/git/jeeves/sofia" isn't supported - ignoring path on the host
INFO Kubernetes file "k8s.yml" created

Jak můžete vidět, vytváří varování, že místní objem nemůže být namontován proti ovladač hlasitosti. To dává smysl, protože k8s nasazení běží "na dálku", tak jsem prostě ignorovat varování.

Běží

Nakonec jsem běh výše uvedených zdrojů s k8s / minikube

minikube start
kubectl apply -f k8s.yml

Všiml jsem si, sofia kontejner udržuje shazovat a restartování takže jsem zkontrolovat protokoly:

$ kubectl get pods
NAME                             READY   STATUS             RESTARTS   AGE
pod/sofia-6668945bc8-x9267       0/1     CrashLoopBackOff   1          10s
pod/postgres-fc84cbd4b-dqbrh     1/1     Running            0          10s
pod/redis-cbff75fbb-znv88        1/1     Running            0          10s

$ kubectl logs pod/sofia-6668945bc8-x9267
Could not locate Gemfile or .bundle/ directory

Že chyba je Ruby/Rails, specifická, ale základní příčinou je, že tam nejsou žádné soubory v kontejneru! Můžu potvrdit zadáním kontejner a kontrola souborů s ls - to je skutečně prázdná.

Otázky

  1. Pokud sofia/sofia:latest obraz je správně postaven s COPY-ied obsah souboru, proč by to zmizet při spouštění kontejneru na minikube?
  2. Co bych měl udělat, aby zajistily, moje soubory zkopírovány správně?

Díky!!!

1

Nejlepší odpověď

2

Problém je, že Objemy se nechová stejným způsobem v Docker v docker-compose a K8s. Kompose nemůže dokonale přeložit objem. V Docker s docker-compose, vaše prohlásil, objem zachovat existující soubory z adresáře, zatímco v k8s, objem je vytvořen prázdný a stín stávající obsah.

Neexistuje žádný přímý ekvivalent docker-compose svazky, které drží stávající soubory v k8s, budete muset pracovat s jednou z následujících možností, v závislosti na tom, co dává smysl v váš případ použití:

  • pákový ConfigMaps přidat své soubory do této aplikace objem (pokud je potřeba, použijte subPath). Pravděpodobně ok pro hrst config soubory, pokud je to to, co život vaší aplikace adresář při spuštění kontejneru
  • ve vašem dockerfile, použijte KOPII na něco jako app-tmp, pak v vstupniho bodu skript zkopírovat tyto soubory z aplikace-adresář tmp na vašem "aplikace" objem
  • Refaktorovat vaši aplikaci tak, aby používala "app1" directory (bez objemu) s existující soubory, "app2" začíná prázdné a je používán jako svůj objem.
2021-11-23 21:08:28

Díky za detailní odpověď! Existuje nějaký způsob, jak můžu mít kompose prostě ignorovat, že konkrétní svazek ( volumes\n- .:/app v docker-compose.yml) úplně? Existuje pouze pro pohodlí v developmenta že objem není opravdu potřeba při nasazení s k8s.
abhchand

Nemohl jsem najít nic, postavené v pro tento případ použití, myslím, že budete potřebovat obal bash script nebo něco podobného, že komentář mimo tyto svazky ve vašem docker-compose.yml souboru za běhu (s sed?), před voláním kompose.
Christophe Schmitz

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................