Ordner und Dateien in Dockware bearbeiten?

Hallo zusammen

Nach längerem Gebastel, habe ich es endlich geschafft, ein Testsystem unter Dockware einzurichten. Nun würde ich gerne die Daten meines Live Systems verwenden. Wie gehe ich dabei am besten vor? FTP Zugriff auf den Container wird wohl eher schwierig - falls überhaupt möglich. Aktuell habe ich nur mittels Putty Zugriff auf meine Dateien und Ordner. Gibts da auch eine Möglichkeit Ordner und Dateien über eine GUI (z.B. wie in FileZilla) zu bearbeiten?

Besten Dank im Voraus für Eure Tipps und Tricks. :slight_smile:

Am besten die Verzeichnisse mounten, dann bleiben die Dateien/Änderungen auch nach herunterfahren des Containers erhalten.

  1. Container starten und Dateien in lokales Verzeichnis laden:
    docker cp shopware:/var/www/html/. ./lokales-verzeichnis
  2. Container stoppen, Mount-Binding in der Composer-File und dann Container neu starten.
# docker-compose.yaml
services:
    service:
        image: dockware/whatever
        #...
        volumes:
            - "./lokales-verzeichnis:/var/www/html/"

Jetzt benutzt der Container die Files aus dem lokalen Verzeichnis.


Über Filezilla kannst du sonst auch SSH/SFTP Zugriff auf den Container einrichten. Ist ja im Prinzip nur der Port der sich ändert, im vergleich zu FTP.

Für eine SFTP-Verbindung mit den SSH-Zugangsdaten, musst du dann Port 22 nehmen.

1 „Gefällt mir“

Vielen herzlichen Dank, Du hast mir den entscheidenden Tipp gegeben. :slight_smile:

Ich dachte bisher immer, dass die Volumes die Ordner und Dateien automatisch auf den lokalen Rechner importieren. Das hat mich jetzt ein riesen Schritt nach vorne gebracht. Leider bin ich aber von der endgültigen Lösung noch etwas entfernt. Und zwar aufgrund folgender Gegebenheit.

Ich installiere Dockware auf meinem Synology NAS was somit einer Linux Umgebung entspricht.

Folgendes Problem habe ich noch:

Ich importiere die gesamten Shopware Folder mit:

docker cp shopware:/var/www/html/. /volume1/docker/shopware

Somit ging ich eigentlich davon aus, dass das Volume wie folgt in der docker-compose.yml eingebunden werden muss:

  `- "/volume1/docker/shopware: /var/www/html/"`

Doch wenn ich dieses so einbinde, wird der Shop nicht mehr geladen. Dieser befindet sich bei mir auf der IP der NAS unter: http://192.168.1.18:8080

Wenn ich jedoch das Volume wie folgt einbinde:

- "/volume1/docker/shopware:/html/"

Erreiche ich die Shopseite sofort wieder.

Die APACHE_DOCROOT enthält bei mir die Standardvorgaben /var/www/html/public

Was ebenfalls eigenartig ist. Sobald ich die Dateien über den nachfolgenden Befehl (docker cp shopware:/var/www/html/. /volume1/docker/shopware) in mein docker Ordner lade, wird die docker-compose.yml überschrieben und der Shop startet überhaupt nicht mehr. Irgendwo mache ich also etwas falsch. Vielleicht siehst du ja den Fehler?

Anbei noch meine eingebundene docker-compose.yml

version: '3'

services:
  shop:
    container_name: shopware
    image: dockware/dev:latest
    ports:
      - "2222:22"     # SSH
      - "8080:80"     # Apache2
      - "4433:443"   # Apache2 HTTPS
      - "8888:8888" # Watch Admin
      - "9998:9998" # Watch Storefront Proxy
      - "9999:9999" # Watch Storefront
      - "3307:3306" # MySQL Port
    volumes:
      - "/volume1/docker/shopware:/html/" 
    environment:
      - XDEBUG_ENABLED=0
      - APACHE_DOCROOT=/var/www/html/public/
      - BASH_ENV=/var/www/html/.bashrc
      - SHOP_DOMAIN=192.168.1.18:8080

## ***********************************************************************
##  NETWORKS
## ***********************************************************************
networks:
  web:
    external: false

Der Abgleich hat jetzt sogar funktioniert, doch dafür erhalte ich nun solche Fehler wenn ich im Admin einlogge. :roll_eyes:

{"errors":[{"code":"0","status":"500","title":"Internal Server Error","detail":"Key path \u0022file:\/\/\/var\/www\/html\/config\/jwt\/public.pem\u0022 does not exist or is not readable","meta":{"trace":[{"file":"\/var\/www\/html\/var\/cache\/dev_h00515fdfebbb63561303b0fa148dd860\/ContainerZX7WKDs\/Shopware_Core_KernelDevDebugContainer.php","line":25257,"function":"__construct","class":"League\\OAuth2\\Server\\CryptKey","type":"-\u003E"},{"file":"\/var\/www\/html\/var\/cache\/dev_h00515fdfebbb63561303b0fa148dd860\/ContainerZX7WKDs\/Shopware_Core_KernelDevDebugContainer.php","line":11251,"function":"getApiAuthenticationListenerService","class":"ContainerZX7WKDs\\Shopware_Core_KernelDevDebugContainer","type":"::"},{"file":"\/var\/www\/html\/vendor\/symfony\/event-dispatcher\/EventDispatcher.php","line":235,"function":"ContainerZX7WKDs\\{closure}","class":"ContainerZX7WKDs\\Shopware_Core_KernelDevDebugContainer","type":"::"},{"file":"\/var\/www\/html\/vendor\/symfony\/event-dispatcher\/EventDispatcher.php","line":70,"function":"sortListeners","class":"Symfony\\Component\\EventDispatcher\\EventDispatcher","type":"-\u003E"},{"file":"\/var\/www\/html\/vendor\/shopware\/core\/Content\/Flow\/Dispatching\/FlowDispatcher.php","line":98,"function":"getListeners","class":"Symfony\\Component\\EventDispatcher\\EventDispatcher","type":"-\u003E"},{"file":"\/var\/www\/html\/vendor\/shopware\/core\/Framework\/Webhook\/WebhookDispatcher.php","line":120,"function":"getListeners","class":"Shopware\\Core\\Content\\Flow\\Dispatching\\FlowDispatcher","type":"-\u003E"},{"file":"\/var\/www\/html\/vendor\/shopware\/core\/Framework\/Event\/NestedEventDispatcher.php","line":64,"function":"getListeners","class":"Shopware\\Core\\Framework\\Webhook\\WebhookDispatcher","type":"-\u003E"},{"file":"\/var\/www\/html\/vendor\/symfony\/event-dispatcher\/Debug\/TraceableEventDispatcher.php","line":276,"function":"getListeners","class":"Shopware\\Core\\Framework\\Event\\NestedEventDispatcher","type":"-\u003E"},{"file":"\/var\/www\/html\/vendor\/symfony\/event-dispatcher\/Debug\/TraceableEventDispatcher.php","line":133,"function":"preProcess","class":"Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcher","type":"-\u003E"},{"file":"\/var\/www\/html\/vendor\/symfony\/http-kernel\/HttpKernel.php","line":157,"function":"dispatch","class":"Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcher","type":"-\u003E"},{"file":"\/var\/www\/html\/vendor\/symfony\/http-kernel\/HttpKernel.php","line":76,"function":"handleRaw","class":"Symfony\\Component\\HttpKernel\\HttpKernel","type":"-\u003E"},{"file":"\/var\/www\/html\/vendor\/shopware\/core\/Framework\/Adapter\/Kernel\/HttpKernel.php","line":44,"function":"handle","class":"Symfony\\Component\\HttpKernel\\HttpKernel","type":"-\u003E"},{"file":"\/var\/www\/html\/vendor\/shopware\/core\/Framework\/Adapter\/Kernel\/HttpCacheKernel.php","line":50,"function":"handle","class":"Shopware\\Core\\Framework\\Adapter\\Kernel\\HttpKernel","type":"-\u003E"},{"file":"\/var\/www\/html\/vendor\/shopware\/core\/Kernel.php","line":157,"function":"handle","class":"Shopware\\Core\\Framework\\Adapter\\Kernel\\HttpCacheKernel","type":"-\u003E"},{"file":"\/var\/www\/html\/vendor\/symfony\/http-kernel\/HttpCache\/SubRequestHandler.php","line":86,"function":"handle","class":"Shopware\\Core\\Kernel","type":"-\u003E"},{"file":"\/var\/www\/html\/vendor\/symfony\/http-kernel\/HttpCache\/HttpCache.php","line":473,"function":"handle","class":"Symfony\\Component\\HttpKernel\\HttpCache\\SubRequestHandler","type":"::"},{"file":"\/var\/www\/html\/vendor\/symfony\/http-kernel\/HttpCache\/HttpCache.php","line":448,"function":"forward","class":"Symfony\\Component\\HttpKernel\\HttpCache\\HttpCache","type":"-\u003E"},{"file":"\/var\/www\/html\/vendor\/symfony\/http-kernel\/HttpCache\/HttpCache.php","line":346,"function":"fetch","class":"Symfony\\Component\\HttpKernel\\HttpCache\\HttpCache","type":"-\u003E"},{"file":"\/var\/www\/html\/vendor\/symfony\/http-kernel\/HttpCache\/HttpCache.php","line":221,"function":"lookup","class":"Symfony\\Component\\HttpKernel\\HttpCache\\HttpCache","type":"-\u003E"},{"file":"\/var\/www\/html\/vendor\/shopware\/core\/HttpKernel.php","line":146,"function":"handle","class":"Symfony\\Component\\HttpKernel\\HttpCache\\HttpCache","type":"-\u003E"},{"file":"\/var\/www\/html\/vendor\/shopware\/core\/HttpKernel.php","line":67,"function":"doHandle","class":"Shopware\\Core\\HttpKernel","type":"-\u003E"},{"file":"\/var\/www\/html\/public\/index.php","line":71,"function":"handle","class":"Shopware\\Core\\HttpKernel","type":"-\u003E"},{"file":"\/var\/www\/html\/vendor\/symfony\/runtime\/Runner\/Symfony\/HttpKernelRunner.php","line":35,"function":"handle","class":"Symfony\\Component\\HttpKernel\\HttpKernelInterface@anonymous\u0000\/var\/www\/html\/public\/index.php:61$0","type":"-\u003E"},{"file":"\/var\/www\/html\/vendor\/autoload_runtime.php","line":29,"function":"run","class":"Symfony\\Component\\Runtime\\Runner\\Symfony\\HttpKernelRunner","type":"-\u003E"},{"file":"\/var\/www\/html\/public\/index.php","line":14,"args":["\/var\/www\/html\/vendor\/autoload_runtime.php"],"function":"require_once"}],"file":"\/var\/www\/html\/vendor\/league\/oauth2-server\/src\/CryptKey.php","line":59}}]}

Mach es das nächste mal mit DDEV

Dockware hat mich fast zum ersten Herzinfarkt gebracht :smiley:

Danke für den vorschlag. Das Problem ist nur, welches von diesen Images installiere ich?

Macht er eigentlich alles automatisch bei
ddev start

Er nutzt mehrere Images, da nicht alles in einem Container liegt. Man muss eigentlich da nichts groß machen, außer das Projekt (ist eine neue Shopware installation) über das Terminal anlegen mit :

mkdir my-shopware6 && cd my-shopware6
ddev config --project-type=shopware6 --docroot=public
ddev composer create shopware/production:^v6.5
# If it asks `Do you want to include Docker configuration from recipes?`
# answer `x`, as we're using DDEV for this rather than its recipes.
ddev exec console system:install --basic-setup
ddev launch /admin
# Default username and password are `admin` and `shopware`

Dann kannst du ganz normal, z.B. mit VS Code in dem Ordner die Dateien bearbeiten. Uber das Terminal von VS Code kannst du auch direkt mit
ddev ssh in den Container rein wenn nötig…kannst aber auch alles von außen machen. Als Beispiel:

ddev exec bin/console cache:clear

Die Schlüssel im config-Verzeichnis müssen die richtigen Rechte haben. Das Problem bei dir werden die verschiedenen Dateisysteme sein. Du kannst dich im Docker-Container einloggen und versuchen die Rechte neu zu setzen:

sudo chown -R www-data:www-data /var/www/html/*
sudo chmod -R 775 /var/www/html
cd /var/www/scripts/shopware6 && php create_jwt.php
cd /var/www/html/config/jwt && sudo chown www-data:www-data *

Wenn das nicht geht, dann ist das NAS vermutlich nicht kompatibel. Weil im Prinzip muss ja der Container Besitzer sein und alle Rechte an den Dateien haben. Bei mir unter WSL Ubuntu gar kein Problem.

Wenn man da einmal durchblickt, ist Dockware ich schon echt super. Die Doku ist umfangreich und die installierten Tools (Logfiles, Mailcatcher) will ich wirklich nicht missen.

Hi Alex

Hammer :grinning:

Hat bestens funktioniert. Jetzt läuft die Kiste.

Ein Problem habe ich aber noch. Wenn ich eine Datenbank importieren möchte bricht er ab. Ich habe dann versucht den mysql Server neu zu starten und erhielt schliesslich folgende Message:

docker exec -it shopware service mysql start
df: /var/lib/mysql/.: Permission denied

  • /etc/init.d/mysql: ERROR: The partition with /var/lib/mysql is too full!

Offenbar hat der Container zu wenig Speicherplatz. Weisst Du wie man diesen erhöhen kann? Platz auf der Platte habe ich noch genügend.

Vielleicht habe ich aber auch nur etwas falsch konfiguriert:

$ docker exec -i shopware mysql -uroot -proot sw6_live_db < /volum                                                          e1/web/sw6_new/backup.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run                                                             /mysqld/mysqld.sock' (13)
User@DS218:~$


LG

Systemprozesse kannst du nur als Root-User starten und stoppen

sudo service mysql start