我正在尝试为Drupal 8创建本地开发。这是我的docker-compose.yml文件的内容。
version: "3"
services:
web:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- "./drupal/web:/var/www/html"
- "./drupal/nginx.conf:/etc/nginx/conf.d/default.conf"
depends_on:
- php
php:
image: drupal:8.6-fpm-alpine
volumes:
- "./drupal/web:/var/www/html"
restart: always
depends_on:
- mysql
mysql:
image: mysql:8
entrypoint: ['/entrypoint.sh', '--default-authentication-plugin=mysql_native_password']
environment:
MYSQL_ROOT_PASSWORD: "drupal"
MYSQL_USER: "drupal"
MYSQL_PASSWORD: "drupal"
MYSQL_DATABASE: "drupal"
volumes:
- "./drupal/mysql:/var/lib/mysql"
如果我替换了drupal的卷,那么它将在drupal容器下创建drupal内容。但是,此后,我无法从主机访问drupal内容。
- /var/www/html/modules
- /var/www/html/profiles
- /var/www/html/themes
- /var/www/html/sites
运行 docker-compose up 之后。我支持在drupal / web文件夹下包含drupal的内容。但是它是空的。你知道发生了什么吗?谢谢,
答案 0 :(得分:1)
关于卷定义,根据this,似乎您必须按照更新的问题中的描述声明它们。
普遍认为/ var / www / html / modules,/ var / www / html / profiles和/ var / www / html / themes通常是卷(可能具有明确的VOLUME声明)在以后对该图像的更新中),但是/ var / www / html / sites的处理有些复杂,因为该目录的内容确实需要使用图像中的内容进行初始化。
因此,您需要将每个路径分别定义为卷,无论是本地目录还是使用命名卷,例如:
docker run --name some-drupal --network some-network -d \
-v /path/on/host/modules:/var/www/html/modules \
-v /path/on/host/profiles:/var/www/html/profiles \
-v /path/on/host/sites:/var/www/html/sites \
-v /path/on/host/themes:/var/www/html/themes \
drupal
关于权限问题,这是因为容器将所有者和组更改为here中的www-data
,而容器使用的UID / GID可能与实际的主机用户不同。从drupal的Dockerfile:
RUN curl -fSL "https://ftp.drupal.org/files/projects/drupal-${DRUPAL_VERSION}.tar.gz" -o drupal.tar.gz \
&& echo "${DRUPAL_MD5} *drupal.tar.gz" | md5sum -c - \
&& tar -xz --strip-components=1 -f drupal.tar.gz \
&& rm drupal.tar.gz \
&& chown -R www-data:www-data sites modules themes
您可以做的是在主机上为drupal的文件设置ACL规则,如下所示,这样您就可以在开发时编辑和修改文件(假设您的用户名是 dale ):>
sudo setfacl -Rm u:dale:rwx,d:u:dale:rwx /path/to/drupal/files
当然,如果您是从主机手动创建文件的,则需要授予该文件适当的权限,以便Web服务器可以通过执行以下命令来访问该文件(假设www-data uid为33,gid为33):
sudo chown 33:33 /path/to/drupla/files_or_directories/ -R