使用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

