Docker容器部署后无法显示构建的代码库

39次阅读
没有评论

问题描述

正在使用Dockerfile将自定义的WordPress代码库打包并上传到私有容器注册表。然后在部署服务器上使用docker-compose.yml文件,并获取自定义镜像。同时,用户还将所需的目录挂载到主机上。容器成功启动并运行,但是之前导入的代码(文件、目录)在部署中无法显示,只有官方的wordpress:latest数据存在。用户想知道问题出在哪里。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

经过一些研究,发现初始问题是由于主机的docker-compose.yml文件中的卷挂载配置引起的。尽管在构建的Dockerfile中使用了以下行来将文件复制到给定路径:

ADD . /var/www/html

但是,由于主机的docker-compose.yml文件中有以下行:

volumes:
  - .:/var/www/html

容器将此目录挂载为其类Unix文件系统的新目录。因此,它掩盖了底层文件。因此,在文件系统中,它是一个新目录,不代表底层文件。基本上是空的。这个Github问题确认了这一点。

然后,它运行wordpress:latest的docker-entrypoint.sh脚本,将/var/www/html设置为工作目录。如果它不包含index.php和wp-includes/version.php(显然由于上述问题,目录是新的),它会下载并解压缩WordPress源代码到此目录。这就是为什么在挂载后,我的旧打包数据不在那里的原因。

所以,我基本上试图做一些不打算做的事情。

正如@Jeremy评论的那样:

as /var/www/html? It sounds like your mount is failing – and that the ADD Is superfluous


另一种尝试是完全错误的。因为我在构建的Dockerfile中添加了一个自定义的ENTRYPOINT脚本,所以它会忽略基础镜像wordpress的ENTRYPOINT和CMD,这就是为什么它不会将新的源代码复制到目录中的原因。

方案2

如果你想保留挂载卷的同时,又想将代码复制到容器中,可以使用以下方法:
1. 在Dockerfile中将代码复制到另一个目录,例如/app:

ADD . /app
  1. 在部署的docker-compose.yml文件中,使用command参数将/app目录中的代码复制到/var/www/html目录:
command: cp -a /app/. /var/www/html

请注意,这个方法会在wordpress:latest脚本运行之前复制官方的wordpress文件,这可能不是你想要的。你可能需要在复制代码之前等待一段时间,以确保wordpress:latest脚本已经运行并将官方文件复制到/var/www/html目录中。

以上是两种解决方案,你可以根据自己的需求选择其中一种。希望能帮到你!

正文完