【问题标题】:Why is this volume mounted as read only?为什么这个卷被安装为只读?
【发布时间】:2021-04-21 02:25:01
【问题描述】:

我从这个链接https://hub.docker.com/_/wordpress 得到一个像这样的 docker-compose.yml 文件。

version: '3.1'

services:

  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - wordpress:/var/www/html

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - db:/var/lib/mysql

volumes:
  wordpress:
  db:

但是该卷没有安装在 wordpress 文件夹上,如果我删除“wordpress”以将卷安装在本地文件夹上,它会被安装,但它是只读的。我没有 Dockerfile 我只是使用默认图像,这就是问题所在?

【问题讨论】:

  • 所以,我知道原因是因为所有者是 www-data 用户和组,我可以用 chown 更改它,但我想避免在创建容器后编写命令。而且我知道我可以在 Dockerfile 中运行命令,但我没有任何命令,而且我更愿意保持这种方式。
  • 我已在我的工作流程答案中添加了更多详细信息,以防您遇到任何问题 ????????

标签: docker docker-compose


【解决方案1】:

我一直使用 docker 来处理 wordpress,这是我的工作流程..(在 Mac 上)

创建一个项目文件夹并用这个添加一个docker-compose.yml 文件..

version: '3.7'

services:

  # here is our mysql container
  db:
    image: mysql:5.7
    volumes:
      - ./db:/var/lib/mysql:delegated
    ports:
      - "3306:3306"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  # here is our wordpress container
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      # our persistent local data re routing
      - .:/var/www/html/wp-content/themes/testing:delegated
      - ./plugins:/var/www/html/wp-content/plugins
      - ./uploads:/var/www/html/wp-content/uploads
      - ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
    ports:
      - "80:80"
    restart: always
    environment:
      # our local dev environment
      WORDPRESS_DEBUG: 1
      DEVELOPMENT: 1
      # docker wp config settings
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_AUTH_KEY: 5f6ede1b94d25a2294e29eeba929a8c80a5ac0fb
      WORDPRESS_SECURE_KEY: 5f6ede1b94d25a2294e29eeba929a8c80a5ac0fb
      WORDPRESS_LOGGED_IN_KEY: 5f6ede1b94d25a2294e29eeba929a8c80a5ac0fb
      WORDPRESS_NONCE_KEY: 5f6ede1b94d25a2294e29eeba929a8c80a5ac0fb
      WORDPRESS_SECURE_AUTH_SALT: 5f6ede1b94d25a2294e29eeba929a8c80a5ac0fb
      WORDPRESS_LOGGED_IN_SALT: 5f6ede1b94d25a2294e29eeba929a8c80a5ac0fb
      WORDPRESS_NONCE_SALT: 5f6ede1b94d25a2294e29eeba929a8c80a5ac0fb
      WORDPRESS_CONFIG_EXTRA: |

        /* Development parameters */
        define('WP_CACHE', false);
        define('ENVIRONMENT', 'local');

        /* Configure mailhog server */
        define('WORDPRESS_SMTP_AUTH', false);
        define('WORDPRESS_SMTP_SECURE', '');
        define('WORDPRESS_SMTP_HOST', 'mailhog');
        define('WORDPRESS_SMTP_PORT', '1025');
        define('WORDPRESS_SMTP_USERNAME', null);
        define('WORDPRESS_SMTP_PASSWORD', null);
        define('WORDPRESS_SMTP_FROM', 'whoever@example.com');
        define('WORDPRESS_SMTP_FROM_NAME', 'Whoever');

        /* other wp-config defines here */

  # here is our mailhog container
  mailhog:
    image: mailhog/mailhog:latest
    ports:
      - "8025:8025"

然后在这个项目文件夹中运行这个终端命令(运行 docker app)..

docker-compose up -d

..你将在http://localhost/拥有一个wordpress网站

docker-compose.yml 已配置,因此您将拥有..

  • Wordpress 站点位于 http://localhost/ 或 http://localhost:80
  • Mailhog 服务器在 http://localhost:8025/ 处捕获所有外发邮件
  • 持久的本地数据库、插件、上传和uploads.ini

所有持久性数据都映射到此项目文件夹,即您的主题文件夹。这样可以为每个项目保持良好和收集的东西..

在执行任何操作之前进行初始构建后,将 uploads.ini 文件夹替换为实际的 uploads.ini 文件..

file_uploads = On
memory_limit = 2000M
upload_max_filesize = 2000M
post_max_size = 2000M
max_execution_time = 600

所以你的项目(主题)文件夹应该是这样的..

现在您可以像这样开始在此文件夹中构建您的主题,将与此本地环境相关的所有内容保留在此处。

每次运行此命令关闭环境..

docker-compose down

下次你在这个项目上运行这个命令..

docker-compose up -d

..您以前的所有数据库、插件和上传都将完全在您离开的地方,这对于 wordpress 本地开发人员来说太棒了!


需要考虑的一些注意事项..




在这个本地 wordpress 项目中使用 GIT

如果您使用 GIT 将此项目保存为存储库,请确保您的 .gitignore 文件不包括这些文件/文件夹..

/vendor
/uploads
/db
/dist
/node_modules
/plugins

值得为您的/db/plugins/uploads 文件夹设置一个备用云备份解决方案,例如谷歌驱动器,以防硬盘驱动器出现故障或其他情况。




部署到服务器,stagingproduction

在此项目的 IDE 设置中,您可能希望排除某些文件和文件夹部署到 stagingproduction 服务器环境,这是我通常排除的内容。..

/Users/joshmoto/Sites/demo/db
/Users/joshmoto/Sites/demo/node_modules
/Users/joshmoto/Sites/demo/src
/Users/joshmoto/Sites/demo/uploads
/Users/joshmoto/Sites/demo/composer.json
/Users/joshmoto/Sites/demo/composer.lock
/Users/joshmoto/Sites/demo/docker-compose.yml
/Users/joshmoto/Sites/demo/package-lock.json
/Users/joshmoto/Sites/demo/package.json
/Users/joshmoto/Sites/demo/uploads.ini
/Users/joshmoto/Sites/demo/webpack.mix.js
/Users/joshmoto/Sites/demo/plugins
/Users/joshmoto/Sites/demo/.gitignore
/Users/joshmoto/Sites/demo/vendor
  • /plugins我通过cPanel或wordpress仪表板上传手动管理,因为同步到远程时索引非常繁重。
  • /vendors 是由 composer 生成的,同样的问题,索引很疯狂,所以最好手动压缩它并通过 cPanel 或您使用的任何服务器管理员上传。



如果您在通过 wordpress 仪表板在本地上传媒体和插件时遇到问题

您有时可能会在使用 dockers wordpress 容器 wp-content 文件夹时遇到一些权限问题。这是一个简单的修复。当您的项目在 docker 中启动并运行时,在项目中运行这些 docker compose 命令以更改 wp-content 文件夹的权限..

显示正在运行的 docker 容器命令..

docker ps

返回结果..

CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                               NAMES
4052536e574a        wordpress:latest         "docker-entrypoint.s…"   1 hour ago          Up 1 hour           0.0.0.0:80->80/tcp                  demo_wordpress_1
b0fbb0a8f9e6        mysql:5.7                "docker-entrypoint.s…"   1 hour ago          Up 1 hour           0.0.0.0:3306->3306/tcp, 33060/tcp   demo_db_1
769262e584e7        mailhog/mailhog:latest   "MailHog"                1 hour ago          Up 1 hour           1025/tcp, 0.0.0.0:8025->8025/tcp    demo_mailhog_1

复制并记下wordpress:latest 容器 ID,在此示例中,我的容器 ID 是..

4052536e574a

现在使用这个 wordpress 容器 ID 运行这个命令来执行这个容器目录中的东西..

docker exec -it 4052536e574a /bin/bash

返回结果..

root@4052536e574a:/var/www/html#

现在我们位于容器根目录中,您现在可以运行此命令,该命令将递归更改 wp-content 上的权限并修复本地 wordpress 仪表板中的上传权限问题。

chown -R www-data:www-data wp-content

您可能必须在项目文件夹上运行 docker-compose downdocker-compose up -d 命令才能使这些更改生效,但我认为您不需要。




如果您想要一个本地自定义 URL 而不是 http://localhost

在终端(这次不在您的项目文件夹中)运行此命令来编辑您的主机文件..

sudo nano /etc/hosts

然后通过终端和WriteOutExit之前将您的自定义网址添加到您的主机文件中。..

127.0.0.1  local.demo.com

现在您的重定向掩码已保存在您的主机中,您需要将其添加到您的docker-compose.yml 下方的/* other wp-config defines here */..

define('WP_HOME','http://local.demo.com');
define('WP_SITEURL','http://local.demo.com');

很遗憾你不能使用https,你必须使用http

您需要docker-compose downdocker-compose up -d 才能让这些新定义的配置在您的本地wp-config.php 中运行。




处理您的暂存和生产 wp-config

您的服务器环境应该使用唯一的盐等独立安装,您不应该docker-compose.yml 配置中获取任何内容,实际上您最初只想添加这些额外的定义..

暂存 wp-config.php

define('ENVIRONMENT', 'staging');
define('WP_DEBUG', true);
define('WP_HOME','https://staging.demo.com');
define('WP_SITEURL','https://staging.demo.com');

生产 wp-config.php

define('ENVIRONMENT', 'production');
define('WP_DEBUG', false);
define('WP_HOME','https://www.demo.com');
define('WP_SITEURL','https://www.demo.com');



更新 dockers wordpress 图片

您无法通过 wordpress 仪表板更新您的本地 wordpress 网站。在我的 docker-compose.yml 示例中,我定义了 image: wordpress:latest,它会在您的 docker 应用上安装最新的 wordpress 图像。

这意味着如果您 docker-compose up -d 在当时使用旧版 wordpress 的项目中,该项目将更新到安装在 docker 上的最新 wordpress 映像。

我没有在docker-compose.yml 中亲自定义wordpress 图像版本,但如果您不希望某些项目在您下一个docker-compose up -d 项目时使用最新图像,您可以这样做。

您必须使用此命令手动更新 wordpress docker 映像..

docker pull wordpress

您必须docker-compose downdocker-compose up -d 才能让您的项目使用最新更新,当您首次通过浏览器访问该网站时,有时需要更新wordpress 数据库。




通过仪表板上传/删除插件时的权限问题

要更改wp-content 文件夹的权限,以便可以通过仪表板写入uploadsplugins

确保在容器运行时运行下面的这些命令...

  1. 显示容器命令...
    docker ps
  2. 记下正在运行的 wordpress 映像的容器 ID
  3. 在容器中执行命令(将[container_id]替换为您的ID,不带括号)...
    docker exec -it [container_id] /bin/bash
  4. 更改 wp-content 文件夹的权限...
    chown -R www-data:www-data wp-content

这应该可以解决使用 docker compose 在本地通过 uploadsplugins 的仪表板上传和删除文件的任何问题。

【讨论】:

  • 很好的答案,所以对于已安装的卷,如果您从仪表板中删除插件,它是否也会删除已安装卷中的文件夹?
  • @leo_cape 是的,如果你通过仪表板安装它会出现在文件夹中,请确保从你的 git repo 中排除插件
  • 谢谢 - 目前它没有为我的设置执行此操作,重新启动时它会正确拉入已安装的文件/插件等,但是在仪表板中删除插件时它不会从卷中删除它。任何想法为什么?它的 RW 不是只读的,但它似乎也在更新您在 docker 文件中引用的卷
  • @leo_cape 请参阅上面的更新答案,关于权限问题的最后一部分。你的uploads.ini 肯定出现在你的项目中吗?
  • hmm 不 - 没有将它添加为卷 - 我只有 wp-content 和插件,是否需要添加 uploads.ini 才能将其写回?不过,我已根据您的上一部分更改了权限
猜你喜欢
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 2020-06-11
  • 2015-02-11
  • 2011-06-06
  • 2023-02-13
相关资源
最近更新 更多