为何Docker容器中存在已通过.dockerignore配置忽略的文件/目录?
问题根源
你的api和app服务中配置了- ./athena:/project的bind mount,该操作会直接将本地athena目录完全替换容器内的/project目录。而.dockerignore仅在镜像构建阶段生效,用于排除不需要COPY到镜像中的文件,完全不影响容器启动后的bind mount行为。容器内出现的__pycache__和should_ignore.txt,本质是本地athena目录中存在的文件,通过挂载直接同步到了容器内。
解决方案
根据使用场景(开发/生产)选择对应方案:
场景1:开发环境(需代码热重载)
开发时需挂载本地代码实现实时生效,可按以下步骤调整:
修正挂载路径
将compose.yaml中api和app服务的volumes配置修改为:volumes: - ./athena:/project/athena此配置仅将本地
athena目录挂载到容器内的/project/athena(与Dockerfile中COPY的路径一致),不会覆盖整个/project目录,镜像中原有的文件(如alembic、配置文件等)会保留,同时本地代码修改可同步到容器。阻止容器生成
__pycache__
在api和app服务中添加环境变量,禁用Python字节码生成:environment: - PYTHONDONTWRITEBYTECODE=1这样容器运行时不会生成新的
__pycache__目录。清理本地冗余文件
删除本地athena目录中的__pycache__和should_ignore.txt,或在本地项目的.gitignore中添加以下规则,避免这些文件在本地生成或提交:__pycache__/ should_ignore.txt
场景2:生产环境(无需热重载)
生产环境直接使用镜像构建的内容即可,无需挂载本地代码:
移除bind mount配置
删除compose.yaml中api和app服务下的volumes配置块。重新构建并启动服务
执行以下命令重新构建镜像(避免缓存影响)并启动容器:docker compose build --no-cache docker compose up -d
内容的提问来源于stack exchange,提问作者Daniel Bailo

