Ich versuche erfolglos, eine Apache-PHP + MySQL + PHPMyAdmin-Entitätenumgebung aufzubauen.
Ich reduziere mein Projekt mit diesen Dateien so einfach wie möglich:
test-docker $ ls -la
total 24
drwxrwxr-x 2 david david 4096 janv. 18 11:01 .
drwxrwxr-x 20 david david 4096 janv. 18 10:59 ..
-rw-rw-r-- 1 david david 457 janv. 18 11:01 docker-compose.yml
-rw-rw-r-- 1 david david 96 janv. 18 11:01 Dockerfile
-rw-rw-r-- 1 david david 214 janv. 18 10:59 .env
-rw-rw-r-- 1 david david 12 janv. 18 11:00 index.php
Der Inhalt jeder Datei:
test-docker $ cat Dockerfile
FROM php:7.0-apache
COPY . /var/www/html
WORKDIR /var/www/html
RUN apt-get update \
&& env
test-docker $ cat docker-compose.yml
version: '2'
services:
web:
build: .
depends_on:
- db
restart: always
environment:
MYSQL_ADDON_HOST: db
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: shyrka
MYSQL_USER: shyrka
MYSQL_PASSWORD: shyrka
dbadmin:
image: phpmyadmin/phpmyadmin
depends_on:
- db
environment:
PMA_HOST: db
PMA_PORT: 3306
restart: always
test-docker $ cat .env
MYSQL_ADDON_DB=shyrka
MYSQL_ADDON_USER=shyrka
MYSQL_ADDON_PASSWORD=shyrka
MYSQL_ADDON_PORT=3306
MAILER_HOST=smtp.sparkpostmail.com
MAILER_USER=SMTP_Injection
MAILER_PASSWORD=d6ed7a00b2032116ef3aa14789759b959aade6e5
Und hier das Ergebnis:
test-docker $ docker-compose up -d
Creating network "testdocker_default" with the default driver
Building web
Step 1 : FROM php:7.0-apache
---> 17c7673c5783
Step 2 : COPY . /var/www/html
---> a7987297ae7b
Removing intermediate container a4daf7dbc92a
Step 3 : WORKDIR /var/www/html
---> Running in d9b6a5426d83
---> ef3d9bb0f0b7
Removing intermediate container d9b6a5426d83
Step 4 : RUN apt-get update && env
---> Running in 6aada591c2a2
Get:1 http://security.debian.org jessie/updates InRelease [63.1 kB]
[...]
Fetched 9856 kB in 2s (4408 kB/s)
Reading package lists...
PHP_EXTRA_CONFIGURE_ARGS=--with-apxs2
APACHE_CONFDIR=/etc/apache2
HOSTNAME=45f28166fed1
PHP_INI_DIR=/usr/local/etc/php
PHP_EXTRA_BUILD_DEPS=apache2-dev
HOME=/root
PHP_LDFLAGS=-Wl,-O1 -Wl,--hash-style=both -pie
PHP_CFLAGS=-fstack-protector-strong -fpic -fpie -O2
PHP_MD5=a51f1d4f03f4e4c745856e9f76fca476
PHP_VERSION=7.0.14
GPG_KEYS=1A4E8B7277C42E53DBA9C7B9BCAA30EA9C0D5763
PHP_CPPFLAGS=-fstack-protector-strong -fpic -fpie -O2
PHP_ASC_URL=https://secure.php.net/get/php-7.0.14.tar.xz.asc/from/this/mirror
PHP_URL=https://secure.php.net/get/php-7.0.14.tar.xz/from/this/mirror
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PHPIZE_DEPS=autoconf file g++ gcc libc-dev make pkg-config re2c
PWD=/var/www/html
PHP_SHA256=0f1dff6392a1cc2ed126b9695f580a2ed77eb09d2c23b41cabfb41e6f27a8c89
APACHE_ENVVARS=/etc/apache2/envvars
---> 8c9978981124
Removing intermediate container 6aada591c2a2
Successfully built 8c9978981124
WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating testdocker_db_1
Creating testdocker_web_1
Creating testdocker_dbadmin_1
docker-composer.yml
Wie Sie sehen, sind weder die in noch in der Datei angegebenen Umgebungsvariablen .env
festgelegt. Und ich weiß nicht, wie ich die IP-Adresse der "db"-Entität an die "web"-Entität in der Umgebung senden soll.
Ich habe die Docker-Dokumentation befolgt. Ich habe den Kern der Sache definitiv nicht verstanden. Ich bitte die Community um Hilfe.
Danke, David.
Antwort1
Dies liegt daran, dass Sie die Umgebungsvariablen festlegen, docker-compose.yml
aber versuchen, sie zur Build-Zeit (auch bekannt als ) zu referenzieren RUN env
. Diese Variablen sind erst nach dem Erstellen des Images im ENTRYPOINT
/ CMD
-Befehl verfügbar.
Sie müssen die Variablen entweder zur Build-Zeit mit dem ENV
darin enthaltenen Befehl festlegen Dockerfile
oder die Variablen verwenden, nachdem der Container gestartet wurde (in Ihrem Fall ist beides in Ordnung).
Um die Datenbank im Webdienst zu referenzieren, müssen Sie ein benutzerdefiniertes Netzwerk erstellen (https://docs.docker.com/compose/compose-file/#/network-configuration-reference) und legen Sie den internen Domänenalias fest oder verweisen Sie den ersten Container mithilfe von Servicelinks (https://docs.docker.com/compose/compose-file/#/links). Die zweite Option scheint in Ihrem Fall angemessener, da der Datenbankdienst nicht auf den Webdienst verweisen muss.
Antwort2
soweit ich weiß, müssen Sie einstellen
env_file: .env
um dies mit .env-Dateien auszuführen.
Was Sie aber wirklich übersehen, ist, dass ENV-Dateien von Docker Compose nicht in Ihrem DOCKERFILE verfügbar sind. Ihr Dockerfile erstellt ein Image, das in einem Container mit Ihren .env-Dateien oder dergleichen ausgeführt wird.
- Schritt - Docker-Image erstellen:
Erstellen Sie einfach Ihr Image mit:
docker build -t NAMESPACE/NAME .
Ersetzen Sie Namespace und Name nach Wunsch.
- Schritt - Ausführen des Images als Container:
Starten Sie einfach docker-compose
. Sie können jetzt Ihre Umgebungsdateien innerhalb des angegebenen EINSTIEGSPUNKTS/CMD sehen und verwenden.
Sie können den Build eines Images nicht mit Umgebungsvariablen ändern, so funktioniert Docker nicht.
Liebe Grüße von unserem Codesprint in Basel,
Bastian