Jak określić limit pamięci i procesora w Docker Compose w wersji 3

113

Nie mogę określić procesora i pamięci dla usług określonych w wersji 3.

W wersji 2 działa dobrze z parametrami „mem_limit” i „cpu_shares” w ramach usług. Ale kończy się niepowodzeniem podczas korzystania z wersji 3, umieszczenie ich w sekcji wdrażania nie wydaje się warte, chyba że używam trybu roju.

Czy ktoś może pomóc?

version: "3"
services:
  node:
    build:
     context: .
      dockerfile: ./docker-build/Dockerfile.node
    restart: always
    environment:
      - VIRTUAL_HOST=localhost
    volumes:
      - logs:/app/out/
    expose:
      - 8083
    command: ["npm","start"]
    cap_drop:
      - NET_ADMIN
      - SYS_ADMIN
vivekyad4v
źródło
4
Podaj link do powiązanego problemu utworzonego w projekcie docker
Guillaume Husta

Odpowiedzi:

93

Wiem, że temat jest trochę stary i wydaje się nieaktualny, ale i tak udało mi się skorzystać z tych opcji:

    deploy:
      resources:
        limits:
          cpus: '0.001'
          memory: 50M

podczas korzystania z wersji 3.7 pliku docker-compose

W moim przypadku pomogło użycie tego polecenia:

docker-compose --compatibility up

--compatibility flaga oznacza (wzięte z dokumentacji):

Jeśli jest ustawiona, Compose spróbuje przekonwertować klucze wdrażania w plikach v3 na ich odpowiedniki inne niż Swarm

Myślę, że to świetnie, że nie muszę przywracać mojego pliku docker-compose z powrotem do wersji v2.

Rigi
źródło
4
Interesujące jest to, że ta opcja zawiera uwagę : „Konwersja jest próbą„ najlepszego wysiłku ”i nie należy jej polegać w przypadku wdrożeń produkcyjnych”.
bartolo-otrit
3
Jest to świetne rozwiązanie dla źle zaprojektowanego programu docker-compose. docker-compose za bardzo stara się być tym, czym nie jest, orkiestratorem klasy produkcyjnej: github.com/docker/compose/issues/4513
443
1
Twoje ograniczenia zasobów nie zaczną obowiązywać, jeśli dostępna jest pamięć RAM / procesor kontenera> Docker dla Windows / Mac. Aby to zmienić, przejdź do preferencji Docker dla komputerów Mac / Windows -> zasoby i odpowiednio dostosuj.
8bitme
59
deploy:
  resources:
    limits:
      cpus: '0.001'
      memory: 50M
    reservations:
      cpus: '0.0001'
      memory: 20M

Więcej: https://docs.docker.com/compose/compose-file/#resources

W twoim konkretnym przypadku:

version: "3"
services:
  node:
    image: USER/Your-Pre-Built-Image
    environment:
      - VIRTUAL_HOST=localhost
    volumes:
      - logs:/app/out/
    command: ["npm","start"]
    cap_drop:
      - NET_ADMIN
      - SYS_ADMIN
    deploy:
      resources:
        limits:
          cpus: '0.001'
          memory: 50M
        reservations:
          cpus: '0.0001'
          memory: 20M

volumes:
  - logs

networks:
  default:
    driver: overlay

Uwaga:

  • Ujawnianie nie jest konieczne, zostanie domyślnie ujawnione w sieci stosu.
  • Obrazy muszą być gotowe. Budowanie w wersji 3 nie jest możliwe
  • „Uruchom ponownie” również jest przestarzałe. Możesz użyć restartu w trakcie wdrażania z akcją po awarii
  • Możesz użyć samodzielnego "roju" z jednym węzłem, większość ulepszeń w wersji 3 (jeśli nie wszystkie) dotyczy roju

Uwaga: Sieci w trybie Swarm nie łączą się. Jeśli chcesz połączyć się tylko wewnętrznie, musisz podłączyć się do sieci. Możesz 1) określić sieć zewnętrzną w innym pliku redagowania lub utworzyć sieć z parametrem --attachable (nakładka docker network create -d My-Network --attachable) W przeciwnym razie musisz opublikować port w następujący sposób:

ports:
  - 80:80
Berndinox
źródło
6
1. Jestem w stanie budować obrazy używając wersji 3. <br/> 2. Wygląda na to, że podejście do v3 jest zupełnie inne niż v2, a nie jak aktualizacja. <br/> 3. Wdrażanie wydaje się działać tylko w trybie roju. Otrzymuję ostrzeżenia - <br/> „OSTRZEŻENIE: niektóre usługi (węzeł) używają klawisza„ wdrażanie ”, który zostanie zignorowany. Tworzenie nie obsługuje konfiguracji wdrażania - użyj go docker stack deploydo wdrożenia w roju.”
vivekyad4v
23
@ viveky4d4v Jak stwierdza format tworzenia wiadomości w wersji 3, deployjest ignorowany, jeśli nie używasz Swarm. Naprawdę nie ma powodu, aby używać formatu v3, chyba że używasz Swarm.
Dan Lowe,
2
Jeśli rozpocznę nowe wdrożenie, zacznę od wersji v3. Nawet jeśli mam tylko jednego hosta. Więc masz możliwość późniejszego skalowania i jest to tyle samo czasu, ile będziesz potrzebować, gdy zrozumiesz koncepcję.
Berndinox,
1
Cześć @Connor, kiedy zredagowałem odpowiedź, wszystko, co zrobiłem, to poprawienie zepsutego linku. Podobnie jak ty, nie jestem w stanie rozszyfrować, co oznacza tutaj „tylko wewnętrznie”.
Jay Taylor
3
@Berndinox Czy wiesz, jak ustawić memory-swapopcję wymienioną na docs.docker.com/v17.12/config/containers/resource_constraints/… ? Nie widzę przykładu, jak to ustawić w docker-compose.yml( docs.docker.com/v17.12/compose/compose-file/#resources ). Dzięki wielkie.
Ryan
49

Docker Compose nie obsługuje ten deployklucz. Jest to szanowane tylko wtedy, gdy używasz pliku YAML wersji 3 w stosie Docker.

Ten komunikat jest drukowany po dodaniu deployklucza do docker-compose.ymlpliku, a następnie uruchomieniudocker-compose up -d

OSTRZEŻENIE: Niektóre usługi (bazy danych) używają klucza „wdrożenie”, który zostanie zignorowany. Kompozycja nie obsługuje konfiguracji „wdrażania” - służy docker stack deploydo wdrażania w roju.

Dokumentacja ( https://docs.docker.com/compose/compose-file/#deploy ) mówi:

Określ konfigurację związaną z wdrażaniem i działaniem usług. Działa to tylko podczas wdrażania do roju z wdrażaniem stosu docker i jest ignorowane przez proces docker-compose up i docker-compose run.

piła303
źródło
2
Dokumenty mówią w szczególności, że jeśli chcesz to zrobić, użyj wersji 2 lub wdróż, aby rój.
ic_fl2,