我正在尝试构建 Apache-PHP + MySQL + PHPMyAdmin 实体环境,但没有成功。
我使用这些文件尽可能简化我的项目:
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
每个文件的内容:
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
结果如下:
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
设置.env
。我不知道如何将“db”实体 IP 地址发送到环境中的“web”实体
我已经阅读了 Docker 文档。但我确实错过了重点。我正在向社区寻求帮助。
谢谢你,大卫。
答案1
这是因为您在设置环境变量时docker-compose.yml
尝试在构建时引用它们(又名)。这些变量仅在构建映像后在/命令RUN env
中可用。ENTRYPOINT
CMD
您要么需要在构建时使用ENV
命令设置变量,Dockerfile
要么在容器启动后使用变量(无论哪种方式都可以)。
至于在 Web 服务中引用数据库,您需要创建一个自定义网络(https://docs.docker.com/compose/compose-file/#/network-configuration-reference)并设置内部域别名或使用服务链接将第一个容器引用到第二个容器(https://docs.docker.com/compose/compose-file/#/links)。第二种方法似乎更适合您的情况,因为 db 服务不需要引用 web 服务。
答案2
据我所知你需要设置
env_file: .env
使用 .env 文件运行此功能。
但您真正缺少的是,docker compose 的 ENV 文件在您的 DOCKERFILE 中不可用。您的 Dockerfile 创建一个映像,使用您的 .env 文件或那些东西在容器中运行此映像。
- 步骤 - 创建Docker映像:
只需使用以下命令构建您的图像:
docker build -t NAMESPACE/NAME .
根据需要替换命名空间和名称。
- 步骤 - 将图像作为容器运行:
只需开始docker-compose
。您现在将能够在给定的 ENTRYPOINT / CMD 中查看和使用您的 envfiles。
您无法使用环境变量来修改图像的构建,这不是 docker 的工作方式。
来自巴塞尔 Codesprint 的问候,
巴斯蒂安