Kategorien
Docker

docker compose WSL2 error: read-only file system

Bei folgender Fehelrmeldung unter Windows sollte man checken, ob das WSL Dateiusystem wirklich mit Schreibrechten gemountet wurde.

Error response from daemon: mkdir /mnt/wsl/docker-desktop-bind-mounts/Ubuntu/490a56f85d61acd79d22117f6cbb91b4edecf27f960a8ab6687ac82c07a3c8cf: mkdir /mnt/wsl/docker-desktop-bind-mounts/Ubuntu/490a56f85d61acd79d22117f6cbb91b4edecf27f960a8ab6687ac82c07a3c8cf: read-only file system

Dies kann man überprüfen mittels:

mount | grep mnt/wsl

Bei mir war /mnt/wsl mit ro (readonly) gekennzeichnet.

Um das zu ändern einfach den folgenden Befehl ausführen um Schreibrechte zu setzen:

sudo mount -o remount,rw /mnt/wsl

Und ein WSL restart

wsl --shutdown
Kategorien
Docker

Docker Windows WSL Date falsch

Wenn die Uhr im Docker Container falsch läuft, liegt das am Host System, unter Windows ist dies Ubuntu. Dort lässt sich die Zeit einstellen mittels:

sudo hwclock -s

Kategorien
Docker

Mehrere Befehle mit docker ausführen

Es gibt mehrere Möglichkeiten, mehrere Befehle mit Docker Compose auszuführen. Hier sind ein paar Beispiele:

  1. Verwenden Sie das && Zeichen, um mehrere Befehle in einer einzigen Zeile auszuführen:
docker-compose exec <service-name> <command1> &amp;&amp; <command2> &amp;&amp; <command3>
  1. Verwenden Sie ein Semikolon, um mehrere Befehle in einer einzigen Zeile auszuführen
docker-compose exec <service-name> <command1>; <command2>; <command3>
  1. Erstellen Sie eine Bash-Skript-Datei mit mehreren Befehlen und führen Sie die Datei mit dem Befehl sh aus:
docker-compose exec <service-name> sh <script-file>
  1. Verwenden Sie eine Bash-Eingabeaufforderung, um mehrere Befehle auszuführen.




Nachdem Sie sich in die Bash-Eingabeaufforderung eingeloggt haben, können Sie mehrere Befehle eingeben und ausführen.

Wenn Sie sich mit einem bestimmten Benutzer anmelden möchten und mehrere Befehle ausführen möchten, können Sie auch den Befehl su verwenden, um den Benutzer zu wechseln, bevor Sie die Befehle ausführen, so wie ich es in meiner vorherigen Antwort erwähnt habe.

docker-compose exec <service-name> su -c "<command1> &amp;&amp; <command2> &amp;&amp; <command3>" <username>

Wichtig ist dass, je nachdem welche Art von Befehlen Sie ausführen, bestimmte Bedingungen erfüllt sein müssen und es auch darauf ankommt ob diese Befehle in einer einzigen Zeile oder in mehreren Zeilen ausgeführt werden sollen.

Kategorien
Docker

Verbinden mit einem Docker Container unter einem bestimmten User

Um sich mit einem bestimmten Benutzer in einen Docker-Container zu verbinden, können Sie den Befehl docker exec verwenden. Der Befehl hat folgendes Format:

docker exec -it [container_name_or_id] [command]

Der Parameter -i sorgt dafür, dass die Standardeingabe (stdin) an die angegebene Befehlszeile gebunden wird, während der Parameter -t dafür sorgt, dass ein pseudo-Terminal erstellt wird. Der container_name_or_id entspricht der ID oder dem Namen des Containers, mit dem Sie sich verbinden möchten. Der command ist der Befehl, den Sie ausführen möchten, wenn Sie sich mit dem Container verbunden haben.

Um sich beispielsweise mit dem Benutzer „testuser“ in einen Container mit dem Namen „mycontainer“ zu verbinden und eine Bash-Sitzung zu starten, würden Sie den folgenden Befehl verwenden:

docker exec -it mycontainer bash -c 'su - testuser'

Beachten Sie, dass Sie nur dann in einen Container als bestimmter Benutzer verbinden können, wenn der Benutzer auch tatsächlich in dem Container vorhanden ist.

Verwendung von docker-compose

Wenn Sie Docker Compose verwenden, können Sie den Befehl docker-compose exec verwenden, um sich mit einem bestimmten Benutzer in einen Container zu verbinden. Der Befehl hat folgendes Format:

Der service_name ist der Name des Dienstes, der in der Compose-Datei definiert ist, mit dem Sie sich verbinden möchten. Der command ist der Befehl, den Sie ausführen möchten, wenn Sie sich mit dem Container verbunden haben.

Um beispielsweise mit dem Benutzer „testuser“ in einen Dienst mit dem Namen „web“ zu verbinden und eine Bash-Sitzung zu starten, würden Sie den folgenden Befehl verwenden:

docker-compose exec web bash -c 'su - testuser'

Wie bereits erwähnt, beachten Sie, dass Sie nur dann in einen Container als bestimmter Benutzer verbinden können, wenn der Benutzer auch tatsächlich in dem Container vorhanden ist.

Kategorien
Docker Symfony

SSO Saml Login mit Symfony

Single-Sign-On ist das Thema der Stunde, es verbessert die Sicherheit und auch die User Verwaltung. Um Saml SSO in Symfony einzubauen gibt es das OneloginSaml Bundle, ein Symfony Wrapper für das php-saml Packet.

Der Vorteil für die Benutzer von SSO liegt darin, dass diese sich morgens einmal authentifizieren müssen und danach den ganzen Tag alle Anwendungen verwenden können ohne sich nochmals einloggen zu müssen.

Der Vorteil für das Unternehmen liegt darin, dass es vorgeben kann, dass die Authentifierung nur mit 2 Faktor Authentifizierung stattfinden kann (z.B. Handy App und Passwort), um mehr Sicherheit zu gewährleisten. Dies kannn in der Zukunft den steigendenden Sicherheitsbedürfnissen angepasst werden. Außerdem können zentral Rechte vergeben werden für User und nach dem Austritt aus dem Unternehmen einfach wieder entzogen werden.

Wenn das Bundle installiert und korrekt konfiguriert ist, benötigt man eine Dev-Umgebung mit einem Identity Provider (IdP). Dafür bietet sich docker-simplesamlphp an:

docker-compose.yml:

version: '3.7'
services:
	idp:
		image: kenchan0130/simplesamlphp
		container_name: idp
		ports:
			- "8080:8080"
		environment:
			SIMPLESAMLPHP_SP_ENTITY_ID: http://localhost/saml/metadata
			SIMPLESAMLPHP_SP_ASSERTION_CONSUMER_SERVICE: http://localhost/saml/acs
			SIMPLESAMLPHP_SP_SINGLE_LOGOUT_SERVICE: http://localhost/saml/logout

Das OneloginSaml Bundle muss folgender Maßen konfiguriert werden:

hslavich_onelogin_saml:
  # Basic settings
  idp:
    # Identifier of the SP entity  (must be a URI)
    entityId: 'http://localhost:8080/simplesaml/saml2/idp/metadata.php'
    singleSignOnService:
      url: 'http://localhost:8080/simplesaml/saml2/idp/SSOService.php'
      binding: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect'
    singleLogoutService:
      url: 'http://localhost:8080/simplesaml/saml2/idp/SingleLogoutService.php'
      binding: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect'
    x509cert: 'insert certificate here'
  # Service Provider Data that we are deploying.
  sp:
    entityId: 'http://localhost/saml/metadata'
    assertionConsumerService:
      url: 'http://localhost/saml/acs'
      binding: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST'
    singleLogoutService:
      url: 'http://localhost/saml/logout'
      binding: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect'
    privateKey: ''

Die Informationen kann man hier ablesen, auch die vom Zertifikat:

SAML Metadata: http://localhost:8080/simplesaml/saml2/idp/metadata.php?output=xhtml

Wenn man alles richtig konfiguriert hat, dann landet man beim Aufruf der Symfony Anwendung auf der Login Seite des IdP Providers und kann sich dort einloggen:

Login Seite des IdP Providers

Die Logins lauten:

admin:     secret
user1:     password
user2:     password

Dann sollte man sich mit seiner Symfony Applikation lokal über SAML einloggen und testen können.

Kategorien
Docker

Docker Windows Port freigeben

Wenn man in Docker unter Windows die Fehlermeldung bekommt:

Error response from daemon: Ports are not available: listen tcp 0.0.0.0:12345: bind: An attempt was made to access a socket in a way forbidden by its access permissions.

Dann muss der Port 12345 freigeben werden:

Dazu muss man auf der Powsershell Konsole mit Admin Rechten erstmal checken, welche Ports schon freiegeben wurden:

netsh interface ipv4 show excludedportrange protocol=tcp

Wenn der Port in den Port Ranges nicht vorhanden ist, kann er folgender Maßen hinzugefügt werden:
  1. Hyper-V ausschalten (und PC neustarten danach)

dism.exe /Online /Disable-Feature:Microsoft-Hyper-V

2.Port hinzufügen:

netsh int ipv4 add excludedportrange protocol=tcp startport=12345 numberofports=1

3. Hyper-V wieder aktivieren (und PC neustarten danach)

dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All

Kategorien
Docker

Docker Image build auf einmal keine Internetverbindung mehr

Wenn man keine Packete installieren kann bei einem Build, kann man versuchen, die docker-machine neuzustarten:

docker-machine restart
Kategorien
Docker

Docker Shell Alias verwenden unter Linux

Um auf der Linux Shell die gewohnten Aliase wie ll für ls -lh zu verwenden, muss man folgenden Trick verwenden:

Da das Login über sh keine Linux Login Shell ist, werden die Alias Definitionen in /etc/profile.d nicht geladen beim Login.

Lösung:

Es reicht, sich mit sh –login im Container anzumleden, dann stehen die Alias Definitionen zur Verfügung.

Kategorien
Amazon AWS Docker PHP 7

DockerFile PHP mit XDebug und Amazon Linux 2

Ein DockerFile für eine PHP 7.2. Umgebung mit XDebug für eine Symfony 4 Umgebung unter Amazon Linux 2:

FROM amazonlinux:2.0.20190823.1

RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

# install php
RUN amazon-linux-extras install -y php7.2
RUN yum install -y php-devel.x86_64 php-xml.x86_64 php-pecl-zip.x86_64  php-intl.x86_64

#install xdebug
RUN yum install -y gcc make
RUN yum install -y php-pear.noarch
RUN pecl install xdebug
RUN echo 'zend_extension=/usr/lib64/php/modules/xdebug.so' >> /etc/php.ini
Kategorien
Docker

Docker Xdebug remote_host setzen in Toolbox für PHPStorm

Um mit Xdebug und PHPStorm im Docker Container debuggen zu können, aber die Fehlermeldung bekommt:

Connection was not established. Probably 'xdebug.remote_host=docker.for.win.localhost' is incorrect

liegt das daran, dass Docker in der Toolbox Variante für Windows den Platzhalter docker.for.win.localhost nicht befüllt. Es muss also die IP des PHPStorm Rechners manuell gesetzt werden.

Dazu setzt man manuell den Wert von xdebug.remote_host auf 192.168.99.1 (die IP Docker für den Host setzt, kann varieren) bei den CLI Interpreter Optionen: