Composer für PHP in separatem Container

xJuliusCaesar

New member
Hallo Leute,
ich habe ein kleines Problem mit dem Composer-Container. Irgendwie will der bei mir nicht so wie ich.
Hier mal meine yml-Datei:
YAML:
---
name: devserver
networks:
  devnetwork:
    driver: bridge
    name: devnetwork
services:
  apache:
    container_name: apache
    depends_on:
      - mariadb
    image: php:apache
    networks:
      - devnetwork
    ports:
      - '80:80'
      - '443:443'
    restart: always
    volumes:
      - ./www:/var/www/html
      - ./configs/php.ini:/usr/local/etc/php/php.ini
  composer:
    container_name: composer
    image: composer:latest
    networks:
      - devnetwork
    volumes:
      - ./www:/var/www
      - ~/.composer:/var/www/.composer
    working_dir: /var/www
  mariadb:
    container_name: mariadb
    environment:
      - MYSQL_ROOT_PASSWORD=Topmsecret-0815
      - MYSQL_DATABASE=testdb
      - MYSQL_USER=xjuliuscaesar
      - MYSQL_PASSWORD=Topmsecret-1307
    image: mariadb:latest
    networks:
      - devnetwork
    restart: always
    volumes:
      - ./database:/var/lib/mysql
  nginx:
    container_name: nginx
    depends_on:
      - mariadb
      - apache
    image: nginx:alpine
    networks:
      - devnetwork
    ports:
      - '82:80'
      - '442:443'
    restart: always
    volumes:
      - ./www:/var/www
      - ./configs/nginx/:/etc/nginx/conf.d
      - ./logs/nginx:/var/log/nginx
  php-fpm:
    build:
      context: ./
      dockerfile: nginxDockerfile
    container_name: php-fpm
    depends_on:
      - mariadb
      - apache
      - nginx
      - composer
    networks:
      - devnetwork
    restart: always
    volumes:
      - ./www:/var/www
    working_dir: /var/www/
  phpmyadmin:
    container_name: phpmyadmin
    depends_on:
      - mariadb
      - apache
      - nginx
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mariadb
    image: phpmyadmin:latest
    networks:
      - devnetwork
    ports:
      - '81:80'
    restart: always
    volumes:
      - ./configs/php.ini:/usr/local/etc/php/php.ini
version: '3.8'

und die composer.json:
JSON:
{
    "name": "php/lernen",
    "description": "Dies ist ein Projekt zum Erlernen der Programmiersprache PHP.",
    "type": "project",
    "require": {
        "monolog/monolog": "^2.0"
    }
}

Prinzipiell startet der Container, aber er wird direkt wieder beendet.
Hier noch das Container-Log:
Code:
2024-04-17 15:10:53    ______
2024-04-17 15:10:53   / ____/___  ____ ___  ____  ____  ________  _____
2024-04-17 15:10:53  / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
2024-04-17 15:10:53 / /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
2024-04-17 15:10:53 \____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
2024-04-17 15:10:53                     /_/
2024-04-17 15:10:53 Composer version 2.7.2 2024-03-11 17:12:18
2024-04-17 15:10:53
2024-04-17 15:10:53 Usage:
2024-04-17 15:10:53   command [options] [arguments]
2024-04-17 15:10:53
2024-04-17 15:10:53 Options:
2024-04-17 15:10:53   -h, --help                     Display help for the given command. When no command is given display help for the list command
2024-04-17 15:10:53   -q, --quiet                    Do not output any message
2024-04-17 15:10:53   -V, --version                  Display this application version
2024-04-17 15:10:53       --ansi|--no-ansi           Force (or disable --no-ansi) ANSI output
2024-04-17 15:10:53   -n, --no-interaction           Do not ask any interactive question
2024-04-17 15:10:53       --profile                  Display timing and memory usage information
2024-04-17 15:10:53       --no-plugins               Whether to disable plugins.
2024-04-17 15:10:53       --no-scripts               Skips the execution of all scripts defined in composer.json file.
2024-04-17 15:10:53   -d, --working-dir=WORKING-DIR  If specified, use the given directory as working directory.
2024-04-17 15:10:53       --no-cache                 Prevent use of the cache
2024-04-17 15:10:53   -v|vv|vvv, --verbose           Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
2024-04-17 15:10:53
2024-04-17 15:10:53 Available commands:
2024-04-17 15:10:53   about                Shows a short information about Composer
2024-04-17 15:10:53   archive              Creates an archive of this composer package
2024-04-17 15:10:53   audit                Checks for security vulnerability advisories for installed packages
2024-04-17 15:10:53   browse               [home] Opens the package's repository URL or homepage in your browser
2024-04-17 15:10:53   bump                 Increases the lower limit of your composer.json requirements to the currently installed versions
2024-04-17 15:10:53   check-platform-reqs  Check that platform requirements are satisfied
2024-04-17 15:10:53   clear-cache          [clearcache|cc] Clears composer's internal package cache
2024-04-17 15:10:53   completion           Dump the shell completion script
2024-04-17 15:10:53   config               Sets config options
2024-04-17 15:10:53   create-project       Creates new project from a package into given directory
2024-04-17 15:10:53   depends              [why] Shows which packages cause the given package to be installed
2024-04-17 15:10:53   diagnose             Diagnoses the system to identify common errors
2024-04-17 15:10:53   dump-autoload        [dumpautoload] Dumps the autoloader
2024-04-17 15:10:53   exec                 Executes a vendored binary/script
2024-04-17 15:10:53   fund                 Discover how to help fund the maintenance of your dependencies
2024-04-17 15:10:53   global               Allows running commands in the global composer dir ($COMPOSER_HOME)
2024-04-17 15:10:53   help                 Display help for a command
2024-04-17 15:10:53   init                 Creates a basic composer.json file in current directory
2024-04-17 15:10:53   install              [i] Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json
2024-04-17 15:10:53   licenses             Shows information about licenses of dependencies
2024-04-17 15:10:53   list                 List commands
2024-04-17 15:10:53   outdated             Shows a list of installed packages that have updates available, including their latest version
2024-04-17 15:10:53   prohibits            [why-not] Shows which packages prevent the given package from being installed
2024-04-17 15:10:53   reinstall            Uninstalls and reinstalls the given package names
2024-04-17 15:10:53   remove               [rm] Removes a package from the require or require-dev
2024-04-17 15:10:53   require              [r] Adds required packages to your composer.json and installs them
2024-04-17 15:10:53   run-script           [run] Runs the scripts defined in composer.json
2024-04-17 15:10:53   search               Searches for packages
2024-04-17 15:10:53   self-update          [selfupdate] Updates composer.phar to the latest version
2024-04-17 15:10:53   show                 [info] Shows information about packages
2024-04-17 15:10:53   status               Shows a list of locally modified packages
2024-04-17 15:10:53   suggests             Shows package suggestions
2024-04-17 15:10:53   update               [u|upgrade] Updates your dependencies to the latest version according to composer.json, and updates the composer.lock file
2024-04-17 15:10:53   validate             Validates a composer.json and composer.lock

Ich hab das Internet durchforstet, aber ich finde nichts.
Ich habe, zu Testzwecken und wie man an den Dateien sieht, einen nginx-Webserver auf Port 82 und einen Apache auf Port 80 laufen. Der Composer sollte nach Möglichkeit so installiert sein, dass er als separater Container für beide Webserver zur Verfügung steht.

Zur Vollständigkeit noch das Dockerfile des nginx-Servers:
Code:
FROM php:fpm

RUN apt-get update && apt-get install -y \
    git \
    curl \
    zip \
    unzip

WORKDIR /var/www

Die Verzeichnisstruktur sieht wie folgt aus:
Code:
Docker
|->    backups
|->    configs
    |->    apache
        > httpd.conf
    |->    nginx
        > nginx.conf
    > php.ini
|->    databases
|->    logs
    |->    nginx
        > access-Earth.log
        > access.log
        > error.log
|->    www
    |->    .composer
> composer.json
> meinWebserver.yml
> nginxDockerfile

Würde mich sehr freuen, wenn mir einer helfen könnte.


Beste Grüße
Nic
 
Dein Container wird beendet, weil der Composer Befehl im Container mit der Ausgabe der Hilfe beendet wird.
Der Lebenszyklus eines Containers hängt am Hauptprozess der im Vordergrund laufen muss. Wird dieser beendet (wie in deinem Fall), dann beendet sich der Container.

In der Image-Beschreibung auf Dockerhub wird bei jedem `docker run` Beispiel <command> angegeben. Deine compose Datei definiert hier für den Composer Service aber nichts, sprich: es wird das Image default verwendet, was dann eben nur "composer" aufruft, was dazu führt, dass die Hilfe angezeigt wird.

Du brauchst sowas hier:
Code:
service:
  composer:
     ...
     command:  ["composer","was-auch-immer-deine-anwendung-startet"]
siehe: https://docs.docker.com/compose/compose-file/05-services/#command
 
Okay. Das heißt, ich muss da eine Anwendung starten, die ihn offen hält?!
Hast du mir da ein Beispiel, was das sein kann?

In meinem Lehrvideo wurde der Composer über das Dockerfile mit
Code:
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
gestartet, was anscheinen auch für den Apache-Webserver funktioniert.
Da es aber in dem Video hieß, dass es besser sei, den Composer in einem separaten Container zu starten (wie das geht, wurde nicht gesagt), habe ich das versucht. Da etwas über Google zu finden ist aber nicht ganz einfach, weil Google bei Composer und Docker irgendwie immer auf die dockercompose.yml raus will. :rolleyes:

Dann werde ich mal schauen, wie das mit der Anwendung geht. Bis dahin läuft es ja erst einmal auch anders.

Danke für deine Hilfe bis dahin.
 
Okay. Das heißt, ich muss da eine Anwendung starten, die ihn offen hält?!
Ich hab keine Ahnung wie Composer arbeitet. Ich hab dir geschrieben wie Container arbeiten: es muss ein Vordergrund Prozess gestartet sein. Die erkennt man ganz gut daran, dass sämtliche Ausgabe auf der Konsole ausgegeben werden, sie das Terminal blockieren und somit kein neuer Prompt erscheint um den nächsten Befehl einzugeben zu können.

Hast du mir da ein Beispiel, was das sein kann?
Ich hab keine Ahnung was Du mit composer machen musst, um eine Anwendung damit zu starten (falls Composer das überhaupt machen kann). In den Beispielen liest es sicher her so, als wenn es wirklich nur Dependency Management macht. Dir hier irgendein Beispiel zu nennen was nichts mit deinem Use-Ccase zu tun hat, wird dir auch nicht weiterhelfen.


gestartet? Die Zeile sieht eher so aus, als wenn sie für die Installation von composer selbst verwendet wird. Eine RUN Anweisung wird genutzt um Dinge im Image anzureichern oder zu verändern. In der RUN Anweisung gestartete Prozesse oder gesetzte Environment-Variablen sind mit Ende der RUN Anweisung weg. Ein Image kann nichts "laufendes" an den Container übergeben. Im Dockerfile sind ENTRYPOINT und CMD vorgesehen, um dort den Befehl zu definieren, der beim Start es Containers gestartet werden soll. Dieser muss natürlich am Ende auch den "Haupt-Prozess" starten der den Container ausmacht.

was anscheinen auch für den Apache-Webserver funktioniert.
Das würde zu meiner Wahrnehmung passen, dass Composer nur Dependency Managment macht und selbst keine Runtime ist. Hier wäre dann nämlich Apache die Runtime.

Da es aber in dem Video hieß, dass es besser sei, den Composer in einem separaten Container zu starten (wie das geht, wurde nicht gesagt), habe ich das versucht. Da etwas über Google zu finden ist aber nicht ganz einfach, weil Google bei Composer und Docker irgendwie immer auf die dockercompose.yml raus will. :rolleyes:
Ich kann dir leider null zu Composer sagen. Ich komme aus dem Enterprise-Umfeld, und dort hat man in der Regel eher keine Berührungspunkte zu php. Zu Java, TypeScript und Python3 könnte ich eher etwas sagen :)

Es führt leider kein Weg daran vorbei zu verstehen, was Composer wirklich tut und wie es zu verwenden ist.

Für mich wirkt es so, als wenn man es in einem Multi-Staged Build in der Build-Stage verwenden wollen würde, in der Finalen Stage würde man dann bspw. nginx als Basis verwenden und die gebauten Artefakte aus der Build-Stage rüberkopieren.

Update: das hier sieht doch brauchbar aus: https://stackoverflow.com/a/68600278/3460948
 
Zuletzt bearbeitet:
Bist Du hier eigentlich schon weiter gekommen?

Ich hab in der Zwischenzeit mal mit einem PHP-Spezi geschnackt, der bestätigt hat das Composer nur für die Dependencies da ist und nicht zum Starten einer Anwendung verwendet wird.

Er empfiehlt hier auch die Verwendung als Multi-Staged Build.
 

Zurzeit aktive Besucher

Neueste Beiträge

Letzte Anleitungen

Statistik des Forums

Themen
4.552
Beiträge
46.594
Mitglieder
4.185
Neuestes Mitglied
harrygrey
Zurück
Oben