소스 검색

Add some notes about volumes in Drupal, especially updating "docker-compose.yml"

I tested this by using `docker-compose up -d`, going through Drupal's web-based setup process to get Drupal fully configured and operational, then used `docker-compose up -d --force-recreate` to force both containers to be re-created (which works very hard to keep the volumes), and verified that my site was still configured and working properly.
Tianon Gravi 9 년 전
부모
커밋
7f751b9041
2개의 변경된 파일45개의 추가작업 그리고 1개의 파일을 삭제
  1. 35 0
      drupal/content.md
  2. 10 1
      drupal/docker-compose.yml

+ 35 - 0
drupal/content.md

@@ -46,6 +46,41 @@ $ docker run --name some-%%REPO%% --link some-postgres:postgres -d %%REPO%%
 -	Database name/username/password: `<details for accessing your PostgreSQL instance>` (`POSTGRES_USER`, `POSTGRES_PASSWORD`; see environment variables in the description for [`postgres`](https://registry.hub.docker.com/_/postgres/))
 -	ADVANCED OPTIONS; Database host: `postgres` (for using the `/etc/hosts` entry added by `--link` to access the linked container's PostgreSQL instance)
 
+## Volumes
+
+By default, this image does not include any volumes. There is a lot of good discussion on this topic in [docker-library/drupal#3](https://github.com/docker-library/drupal/issues/3), which is definitely recommended reading.
+
+There is consensus that `/var/www/html/modules`, `/var/www/html/profiles`, and `/var/www/html/themes` are things that generally ought to be volumes (and might have an explicit `VOLUME` declaration in a future update to this image), but handling of `/var/www/html/sites` is somewhat more complex, since the contents of that directory *do* need to be initialized with the contents from the image.
+
+If using bind-mounts, one way to accomplish pre-seeding your local `sites` directory would be something like the following:
+
+```console
+$ docker run --rm %%REPO%% tar -cC /var/www/html/sites . | tar -xC /path/on/host/sites
+```
+
+This can then be bind-mounted into a new container:
+
+```console
+$ docker run --name some-%%REPO%% --link some-postgres:postgres -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 \
+	%%REPO%%
+```
+
+Another solution using Docker Volumes:
+
+```console
+$ docker volume create %%REPO%%-sites
+$ docker run --rm -v %%REPO%%-sites:/temporary/sites %%REPO%% cp -aRT /var/www/html/sites /temporary/sites
+$ docker run --name some-%%REPO%% --link some-postgres:postgres -d \
+	-v %%REPO%%-modules:/var/www/html/modules \
+	-v %%REPO%%-profiles:/var/www/html/profiles \
+	-v %%REPO%%-sites:/var/www/html/sites \
+	-v %%REPO%%-themes:/var/www/html/themes \
+```
+
 ## %%COMPOSE%%
 
 ## Adding additional libraries / extensions

+ 10 - 1
drupal/docker-compose.yml

@@ -1,6 +1,7 @@
 # Drupal with PostgreSQL
 #
-# Access via "http://localhost:8080" (or "http://$(docker-machine ip):8080" if using docker-machine)
+# Access via "http://localhost:8080"
+#   (or "http://$(docker-machine ip):8080" if using docker-machine)
 #
 # During initial Drupal setup,
 # Database type: PostgreSQL
@@ -17,6 +18,14 @@ services:
     image: drupal:8.2-apache
     ports:
       - 8080:80
+    volumes:
+      - /var/www/html/modules
+      - /var/www/html/profiles
+      - /var/www/html/themes
+      # this takes advantage of the feature in Docker that a new anonymous
+      # volume (which is what we're creating here) will be initialized with the
+      # existing content of the image at the same location
+      - /var/www/html/sites
     restart: always
 
   postgres: