我在一个项目中呆了几天,我的任务是使用 Docker。在学习了几个教程之后,我找到了使用 docker-compose 部署 LAMP 服务器的简单方法,如下所示:
version: '3.7'
services:
php-httpd:
image: php:7.3-apache
ports:
- 80:80
volumes:
- "./DocumentRoot:/var/www/html"
mariadb:
image: mariadb:10.5.2
volumes:
- mariadb-volume:/var/lib/mysql
environment:
TZ: "Europe/Rome"
MYSQL_ALLOW_EMPTY_PASSWORD: "no"
MYSQL_ROOT_PASSWORD: "rootpwd"
MYSQL_USER: 'testuser'
MYSQL_PASSWORD: 'testpassword'
MYSQL_DATABASE: 'testdb'
phpmyadmin:
image: phpmyadmin/phpmyadmin
links:
- 'mariadb:db'
ports:
- 8081:80
volumes:
mariadb-volume:
现在,在我的应用程序处于开发阶段后,我发现一个问题,我需要编辑 .htaccess
以打开 mod_rewrite 并为 REST API 添加一些规则。
我找到的所有解决方案都提到我应该在 dockerfile
中添加类似于此的 RUN 命令:
FROM httpd:alpine
# Copy .htaccess into DocumentRoot
COPY ./.htaccess /var/www/html/
RUN sed -i '/LoadModule rewrite_module/s/^#//g' /usr/local/apache2/conf/httpd.conf
但是我没有那个文件,官方文档对我没有帮助。
我所做的就是sudo docker-compose up -d
来运行我的图像。所以问题是:
我应该在什么阶段、如何以及在哪里添加此文件才能使其正常工作。
我知道这是可能的,因为我在一个教程中发现了这样的说法:
Next time around, we'll create a more complicated docker-compose.yml file, one that works in conjunction with a Dockerfile.
但是没有后续行动。
如果有任何关于此的指导,我将不胜感激。
此外,我知道我可以通过以下方式访问 PHP 镜像:docker exec -it linuxconfig_php-httpd_1 bash
。
也许我可以用它做点什么?
最佳答案
您有两个选择:
- Docker 是一个分层文件系统,您可以使用一个镜像并对其进行修改以创建另一个镜像,然后您可以将其推送到您的私有(private) Docker 注册表或公共(public) dockerhub。要使用 .htaccess 更改创建自定义镜像,您将创建一个名为“Dockerfile”的文件。然后,您将 Dockerfile 放在修改后的 .htaccess 所在的同一目录中
Dockerfile 内容
FROM php:7.3-apache
RUN sed -i '/LoadModule rewrite_module/s/^#//g' /usr/local/apache2/conf/httpd.conf
创建图像:
docker build -t custom-php:7.3-apache .
这将创建一个新的图像名称(custom-php:7.3-apache)。然后,您可以在 docker-compose.yml 文件中使用这个新镜像,部署后,容器将具有更新的 .htaccess
- 您可以使用volumes选项将.htaccess挂载到所需路径,如下所示
.
php-httpd:
image: php:7.3-apache
ports:
- 80:80
volumes:
- "./DocumentRoot:/var/www/html"
- "./.htaccess:/var/www/html/.htaccess"
我更喜欢#2,因为您可以编辑 .htaccess 规则而无需重建图像。
关于Docker compose 和 dockerfile/.htaccess 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67812384/