如何使用Dockerfile将本地wp-content文件复制到WordPress容器中

6
我是一名有用的助手,可以为您翻译文本。
我有一个WordPress容器,希望在启动时将本地文件夹(包含文件)复制到该容器中。
我有以下本地文件夹:
/html/wp-content/plugins
/html/wp-content/themes
/html/wp-content/uploads

我有一个包含以下内容的Dockerfile:
FROM wordpress

COPY ./html/wp-content/plugins/ /var/www/html/wp-content/plugins
COPY ./html/wp-content/themes/ /var/www/html/wp-content/themes
COPY ./html/wp-content/uploads/ /var/www/html/wp-content/uploads

ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["apache2-foreground"]

尽管复制操作成功(构建通过),但文件未显示在这些目标文件夹中。 如果我将目标文件夹更改为 /html 之前的任何路径,例如我将目标文件夹设置为 /var 或 /var/www,则文件会被复制并且我可以在容器中看到它们。 我查看了这篇旧文章, 提到 /html 文件夹实际上是在启动时作为卷挂载的,因此我需要先将文件复制到该文件夹中。
/usr/src/wordpress/wp-content

然后在启动时,这些文件夹将自动复制到 /var/www/html/wp-content/。(这就解释了为什么直接复制似乎不起作用)我也尝试过,虽然我的本地文件夹确实被复制到这些文件夹中(我可以在容器中看到它们),但它们在启动时没有被复制到 /var/www/html/content!是否可能通过 dockerfile 直接将本地文件复制到 /var/www/html 文件夹中?如果不行,我该如何确保在将文件复制到 /usr/src/wordpress/wp-content 时,这些文件夹会在启动时被复制到 /var/www/html/wp-content/?(我查阅的一些帖子都不起作用,因为这似乎是特定于 Wordpress 而不是单独进行 Dockerfile 复制的情况)

Dockerfile复制保留子目录结构 Docker未将子目录复制到容器中 如何从Dockerfile复制文件夹到docker镜像中? https://www.serverlab.ca/tutorials/containers/docker/how-to-host-your-wordpress-site-with-docker/ Wordpress docker复制主题到公开文件夹中


1
Ronald Johnson在Stack Overflow上发布了一个回答,其中提到:“..在apache2.conf或其他配置文件中,路径末尾可能会出现斜杠放错或未放置的情况。”。 - Scratte
1
你找到解决方案并可以分享吗?我自己也遇到了同样的问题! - Flamur Mavraj
最终,我改变了方向,使用了挂载卷,这在部署流程中有所帮助。但是仍然无法找到适用于WordPress的万能流程 - 因此我仍然需要对生产环境进行一些更改,这并不理想。 - leo_cape
@Scratte,答案可能已被删除,但从你的描述来看,我认为那不是问题所在。 - leo_cape
@leo_cape 是的,它已被删除。我在审核时发现了它。我不知道它是否有用,所以我把内容放在了评论中。如果你愿意,我可以删除这个评论。 - Scratte
2个回答

0
今天我碰到了同样的问题。我想在使用COPY构建镜像时添加主题,但是没成功。这是因为我已将我的wp-content文件夹设置为卷。似乎不能将内容复制到卷中。
以下链接中的讨论帮助我认识到了这一点:

https://github.com/docker-library/wordpress/issues/146

以下是我添加的WordPres Dockerfile和docker-compose文件。在注释掉卷后,一切都如预期运行。

希望两年后你不再需要它了,哈哈。

参考: https://docs.docker.com/samples/wordpress/

Dockerfile

FROM wordpress:latest

WORKDIR /var/www/html

COPY ./wp-content/ ./wp-content/
RUN chmod -R 755 ./wp-content/


docker-compose.yml

version: "3"
services:
  db:
    build:
      context: .
      dockerfile: ./compose/local/db/Dockerfile
    image: new_db_image_name
    container_name: new_db_image_name
    command: '--default-authentication-plugin=mysql_native_password'
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=somewordpress
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=wordpress
    expose:
      - 3306
      - 33060
  wordpress:
    build:
      context: .
      dockerfile: ./compose/local/wordpress/Dockerfile
    image: new_wordpress_image_name
    container_name: new_wordpress_image_name
#    volumes:
#      - wp-content:/var/www/html/wp-content
    ports:
      - 80:80
    restart: always
    environment:
      - WORDPRESS_DB_HOST=db
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=wordpress
      - WORDPRESS_DB_NAME=wordpress

volumes:
  db_data:
#  wp-content:




0
我也遇到了这个问题。我认为选择会取决于你的目标。由于我对WordPress和Docker都比较新手,所以一开始并没有明确的目标,直到我经历了所有的麻烦。
对于本地主题/插件开发
对我来说,我想要使用Docker进行WordPress主题/插件开发,所以我最终做的就是将我的本地主题/插件文件夹与容器中的文件夹进行绑定挂载,在我的compose文件中使用格式<本地文件夹>:<容器文件夹>,例如:
wordpress:
      volumes:
            - ./src/themes:/var/www/html/wp-content/themes
            - ./src/plugins:/var/www/html/wp-content/plugins

尽管后来我发现我可以使用@wordpress/env,它是在Docker之上的一个封装器。

用于生产镜像

最初我试图做这个,但没有意识到这不是我真正想要的,但我还是让它工作了。我所做的只是使用了一个命名卷。这里只展示了docker compose文件的相关部分的示例。

services:
      wordpress:
            volumes:
            - wp_data:/var/www/html
volumes:
  wp_data:

然后重新构建镜像,并使用docker compose up --build命令启动容器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接