You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Bitnami CodeIgniter镜像,Docker复制文件后本地挂载目录无文件求助

问题描述

我在Docker中使用Bitnami CodeIgniter镜像,项目结构如下:

my-source-code
   |Dockerfile
   |hello-world.php
   |Home.php
docker-compose.yml

docker-compose.yml内容:

# Copyright VMware, Inc.
# SPDX-License-Identifier: APACHE-2.0

version: '2'

services:
  mariadb:
    image: docker.io/bitnami/mariadb:10.6
    environment:
      # ALLOW_EMPTY_PASSWORD is recommended only for development.
      - ALLOW_EMPTY_PASSWORD=yes
      - MARIADB_USER=bn_myapp
      - MARIADB_DATABASE=bitnami_myapp
    volumes:
      - './my-database:/bitnami/mariadb'
  my-docker-app:
    build: ./my-souce-code
    ports:
      - '8000:8000'
    environment:
      # ALLOW_EMPTY_PASSWORD is recommended only for development.
      - ALLOW_EMPTY_PASSWORD=yes
      - CODEIGNITER_DATABASE_HOST=mariadb
      - CODEIGNITER_DATABASE_PORT_NUMBER=3306
      - CODEIGNITER_DATABASE_USER=bn_myapp
      - CODEIGNITER_DATABASE_NAME=bitnami_myapp
    volumes:
      - './my-docker-project:/app'
    depends_on:
      - mariadb

我希望构建CodeIgniter镜像并将默认欢迎页改为Hello World,my-source-code中的Dockerfile内容如下:

FROM bitnami/codeigniter:4

COPY hello_world.php ./my-docker-app/app/Views/hello_world.php
COPY Home.php ./my-docker-app/app/Controllers/Home.php 

执行docker compose up后,日志显示已完成两个文件的复制,但本地挂载的my-docker-project目录中却找不到这些文件。我猜测是先执行了复制操作再构建CodeIgniter镜像,请问如何在CodeIgniter镜像构建完成后再执行文件复制?


解决方案

根本原因

你的猜测有误,问题核心是容器启动时,本地目录./my-docker-project挂载到容器的/app路径,完全覆盖了镜像中/app目录的内容。Dockerfile中的复制操作确实已经把文件放到了镜像的/app下,但挂载本地目录后,镜像里的文件被隐藏,所以本地目录看不到这些文件。

可行解决办法

1. 仅挂载需要自定义的子目录

如果需要本地开发实时同步代码,不要挂载整个/app,只挂载需要修改的Controllers和Views目录:
修改docker-compose.yml中my-docker-app的volumes配置:

volumes:
  - './my-docker-project/app/Controllers:/app/app/Controllers'
  - './my-docker-project/app/Views:/app/app/Views'

这样镜像中/app的其他文件不会被覆盖,同时本地修改这两个目录的文件会同步到容器内。

2. 先初始化本地挂载目录

如果必须挂载整个/app,先把镜像中的/app内容同步到本地目录:

  • 先构建镜像:
    docker compose build my-docker-app
    
  • 启动临时容器,复制镜像内的/app内容到本地:
    docker run --rm -v $(pwd)/my-docker-project:/tmp/app my-docker-app cp -r /app/. /tmp/app/
    
  • 手动将自定义文件复制到本地对应目录:
    cp my-source-code/hello-world.php my-docker-project/app/Views/
    cp my-source-code/Home.php my-docker-project/app/Controllers/
    
  • 再执行docker compose up启动服务,此时本地目录已包含完整的CodeIgniter文件和自定义文件,挂载后不会丢失。

3. 利用Bitnami镜像的初始化特性

Bitnami的CodeIgniter镜像会在容器启动时,将/opt/bitnami/codeigniter下的默认文件复制到/app(如果/app为空)。调整Dockerfile,将自定义文件复制到/opt/bitnami/codeigniter对应的路径:
修改my-source-code/Dockerfile:

FROM bitnami/codeigniter:4

COPY hello_world.php /opt/bitnami/codeigniter/app/Views/hello_world.php
COPY Home.php /opt/bitnami/codeigniter/app/Controllers/Home.php 

容器启动时,会自动将/opt/bitnami/codeigniter的内容同步到/app,自定义文件也会被同步到本地挂载目录中。


内容的提问来源于stack exchange,提问作者Farid Cenreng C038DSX0869

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 20:55:34