apache 在构建Docker映像和容器时;它的作用域不包括预期的目录

swvgeqrz  于 2022-11-16  发布在  Apache
关注(0)|答案(1)|浏览(146)

我试图帮助一个朋友在一个项目中,他实现了docker,尽管它的结构是多么奇怪,它是相关的,他的目标,如果有必要深入到这个主题,让我知道在评论。
我们正在进行的项目是这样的:
https://github.com/arcanisgk/Last-Hammer-2
项目结构如下所示:
project structure(我的声望不够,无法显示此图像。)

风景(上下文):

要启动Docker,请运行以下命令:

  • -构建--强制-重新创建

**注意:**这是因为Docker结构位于Docker目录中。

当构建完成时,我们应该有:
container runing
为此,实现了以下文件:

嵌入程序/.env

# Please Note:
# In PHP Versions <= 7.4 MySQL8 is not supported due to lacking pdo support

# To determine the name of your containers
COMPOSE_PROJECT_NAME=Last-Hammer-2
WEB_MASTER=icarosnet@gmail.com

# Possible values: php54, php56, php71, php72, php73, php74, php8, php81
PHPVERSION=php81
DOCUMENT_ROOT=./../
APACHE_DOCUMENT_ROOT=/var/www/html/public
VHOSTS_DIR=./config/vhosts
APACHE_LOG_DIR=./logs/apache2
PHP_INI=./config/php/php.ini
SSL_DIR=./config/ssl

# PHPMyAdmin
UPLOAD_LIMIT=512M
MEMORY_LIMIT=512M

# Xdebug
XDEBUG_LOG_DIR=./logs/xdebug
XDEBUG_PORT=9003
#XDEBUG_PORT=9000

# Possible values: mysql57, mysql8, mariadb103, mariadb104, mariadb105, mariadb106
#
# For Apple Silicon User: 
# Please select Mariadb as Database. Oracle doesn't build their SQL Containers for the arm Architecure

DATABASE=mysql8
MYSQL_INITDB_DIR=./config/initdb
MYSQL_DATA_DIR=./data/mysql
MYSQL_LOG_DIR=./logs/mysql

# If you already have the port 80 in use, you can change it (for example if you have Apache)
HOST_MACHINE_UNSECURE_HOST_PORT=8008

# If you already have the port 443 in use, you can change it (for example if you have Apache)
HOST_MACHINE_SECURE_HOST_PORT=443

# If you already have the port 3306 in use, you can change it (for example if you have MySQL)
HOST_MACHINE_MYSQL_PORT=3307

# If you already have the port 8080 in use, you can change it (for example if you have PMA)
HOST_MACHINE_PMA_PORT=8009
HOST_MACHINE_PMA_SECURE_PORT=8443

# If you already has the port 6379 in use, you can change it (for example if you have Redis)
HOST_MACHINE_REDIS_PORT=6379

# MySQL root user password
MYSQL_ROOT_PASSWORD=1qazxsw22

# Database settings: Username, password and database name
#
# If you need to give the docker user access to more databases than the "docker" db 
# you can grant the privileges with phpmyadmin to the user.
MYSQL_USER=lh2
MYSQL_PASSWORD=1qazxsw22
MYSQL_DATABASE=lh2

停靠-撰写.yml

version: "3.9"

services:
  webserver:
    build:
      context: ./bin/${PHPVERSION}
    container_name: "${COMPOSE_PROJECT_NAME}-${PHPVERSION}"
    restart: "always"
    ports:
      - "${HOST_MACHINE_UNSECURE_HOST_PORT}:80"
      - "${HOST_MACHINE_SECURE_HOST_PORT}:443"
    links:
      - database
    volumes:
      - ${DOCUMENT_ROOT-./../}:/var/www/html:rw
      - ${PHP_INI-./config/php/php.ini}:/usr/local/etc/php/php.ini
      - ${SSL_DIR-./config/ssl}:/etc/apache2/ssl/
      - ${VHOSTS_DIR-./config/vhosts}:/etc/apache2/sites-enabled
      - ${LOG_DIR-./logs/apache2}:/var/log/apache2
      - ${XDEBUG_LOG_DIR-./logs/xdebug}:/var/log/xdebug
    environment:
      APACHE_DOCUMENT_ROOT: ${APACHE_DOCUMENT_ROOT-/var/www/html}
      PMA_PORT: ${HOST_MACHINE_PMA_PORT}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      HOST_MACHINE_MYSQL_PORT: ${HOST_MACHINE_MYSQL_PORT}
      XDEBUG_CONFIG: "client_host=host.docker.internal remote_port=${XDEBUG_PORT}"
    extra_hosts:
      - "host.docker.internal:host-gateway"
  database:
    build:
      context: "./bin/${DATABASE}"
    container_name: "${COMPOSE_PROJECT_NAME}-${DATABASE}"
    restart: "always"
    ports:
      - "127.0.0.1:${HOST_MACHINE_MYSQL_PORT}:3306"
    volumes:
      - ${MYSQL_INITDB_DIR-./config/initdb}:/docker-entrypoint-initdb.d
      - ${MYSQL_DATA_DIR-./data/mysql}:/var/lib/mysql
      - ${MYSQL_LOG_DIR-./logs/mysql}:/var/log/mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
  phpmyadmin:
    image: phpmyadmin
    restart: always
    container_name: "${COMPOSE_PROJECT_NAME}-phpmyadmin"
    links:
      - database
    environment:
      PMA_HOST: database
      PMA_PORT: 3306
      PMA_USER: root
      PMA_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      UPLOAD_LIMIT: ${UPLOAD_LIMIT}
      MEMORY_LIMIT: ${MEMORY_LIMIT}
    ports:
      - "${HOST_MACHINE_PMA_PORT}:80"
      - "${HOST_MACHINE_PMA_SECURE_PORT}:443"
    volumes:
      - /sessions
      - ${PHP_INI-./config/php/php.ini}:/usr/local/etc/php/conf.d/php-phpmyadmin.ini
  redis:
    restart: always
    container_name: "${COMPOSE_PROJECT_NAME}-redis"
    image: redis:latest
    ports:
      - "127.0.0.1:${HOST_MACHINE_REDIS_PORT}:6379"

/配置文件/虚拟主机/默认.conf

<VirtualHost *:80>
    ServerAdmin ${WEB_MASTER}
    DocumentRoot ${APACHE_DOCUMENT_ROOT}
    ServerName localhost
    <Directory ${APACHE_DOCUMENT_ROOT}>
        Options Indexes FollowSymLinks Includes ExecCGI
        AllowOverride All
        Require all granted
        Allow from all
    </Directory>
</VirtualHost>

问题:

我们希望能够使用public目录作为项目的document_root来放置我们的index.php,这很容易实现;但是当我们尝试访问compose vendor来访问compose.json中声明的autoload file时,我们发现它不存在,我运行这个命令来检查哪个目录存在:

$files1 = scandir(dirname(__DIR__).'/../');

var_dump($files1);

获得以下输出:
output scandir

更新:

根据我们的调查,问题似乎出在这些配置行上,或者说它们与以下内容相关:

在环境中

DOCUMENT_ROOT=./../
APACHE_DOCUMENT_ROOT=/var/www/html/public

在默认.conf中

<Directory ${APACHE_DOCUMENT_ROOT}>

文件名为docker-compose.yml

volumes:
      - ${DOCUMENT_ROOT-./../}:/var/www/html:rw

我非常肯定这是一个逻辑错误...因为我们由于某种原因没有访问供应商目录,所以它没有被上传到构建中的容器;要更正此错误,需要进行哪些更改?
还观察到无法访问其他目录,例如:FrameWork和log,简而言之,没有对项目根目录中的任何内容的访问权限。

ru9i0ody

ru9i0ody1#

必须进行以下更改:
.yml中,将以下内容添加到卷中:

volumes:
  - ./../:/var/www/html:rw

apache conf必须指向:

DocumentRoot ${APACHE_DOCUMENT_ROOT}/public

<Directory ${APACHE_DOCUMENT_ROOT}>

.env文件必须如下所示:

DOCUMENT_ROOT=./../public
APACHE_DOCUMENT_ROOT=/var/www/html

我试过了,它对我很有效...虽然我不知道确切的理论/定义,但有人能对这个答案进行扩展吗?
将来甚至可能有其他更有效的方法来实现它。

相关问题