【问题标题】:.dockerignore: some files are ignored, some are not.dockerignore:有些文件被忽略,有些没有
【发布时间】:2020-08-26 22:20:30
【问题描述】:

问题

您好,我是 Docker 新手。我想在我的 Django 项目中使用 .dockerignore 忽略一些文件和目录。一开始没有忽略任何文件,后来在stackoverflow中搜索,发现是因为docker-compose.yml中的volumes,所以我把它注释掉了。但是现在有些文件和目录被忽略了,但有些不是( pycache , db.sqlite3 )。我遇到了很多问题,但找不到任何解决方案。

项目结构

-src
--coreapp
---migrations
---__init__.py
---__pycache__
---admin.py
---apps.py
---models.py
---tests.py
---views.py
---tests.py
--admin.json
--db.sqlite3
--manage.py
-.dockerignore
-.gitignore
-docker-compose.yml
-Dockerfile
-Procfile
-README.md
-requirements.txt
-runtime.txt

Dockerfile

FROM python:3.7

ENV PYTHONUNBUFFERED 1

COPY ./requirements.txt /code/requirements.txt
RUN pip install -r /code/requirements.txt

COPY . /code/
WORKDIR /code/

EXPOSE 8000

docker-compose.yml

version: '3'

services:
  db:
    image: postgres

  web:
    build: .
    command: bash -c "python src/manage.py runserver 0.0.0.0:8000"
#    volumes:
#      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

.dockerignore

# Byte-compiled / optimized / DLL files
__pycache__/

**/migrations
src/media
src/db.sqlite3
Procfile
.git

命令

# build image
sudo docker-compose up --build

# to enter container
sudo docker exec -it [container id] bash

# to check ignored files inside the container
ls

预期输出

# Byte-compiled / optimized / DLL files
__pycache__/ # ignored

**/migrations # ignored
src/media # ignored
src/db.sqlite3 # ignored
Procfile # ignored
.git # ignored

原始输出

# Byte-compiled / optimized / DLL files
__pycache__/ # NOT ignored

**/migrations # ignored
src/media # ignored
src/db.sqlite3 # NOT ignored
Procfile # ignored
.git # ignored

尝试

__pycache__/
**/__pycache__
**/*__pycache__
**/*__pycache__*
**/*__pycache__/
**/__pycache__/

*/db.sqlite3
db.sqlite3

【问题讨论】:

  • 你能把这个减少到minimal reproducible example吗?您希望忽略哪个文件,不是吗? (或者不被忽略,是吗?)如果你docker-compose run web ls,你会得到不同的输出吗?
  • @DavidMaze 我期待 pycache 和 db.sqlite3 被忽略。在我运行命令 sudo docker-compose run web ls src/ 后,我没有看到 db.sqlite3,所以我猜它被忽略了,但 pycache 仍然存在。

标签: django docker docker-compose


【解决方案1】:

.dockerignore 文件仅影响将哪些文件复制到 Dockerfile COPY 行中的映像中(从技术上讲,构建上下文中包含哪些文件)。这并不意味着这些文件永远不会存在于映像或容器中,只是它们不包含在初始副本中。

您应该能够通过查看docker build 输出来验证这一点。每一步之后都会有一行---> 0123456789ab;这些十六进制数字是有效的 Docker 映像 ID。找到COPY 步骤后立即创建的图像并运行

docker run --rm 0123456789ab ls

如果您稍微探索一下这种方式,您应该会看到容器中的__pycache__ 目录要么完全不存在,要么与主机不同。

在您提到的具体文件中,db.sqlite3 文件是您实际应用程序的数据库,它会在您启动应用程序时创建;这就是为什么你在 docker exec 进入一个正在运行的容器中看到它的原因,但当你 docker run 一个来自图像的干净容器时却看不到它。 What is __pycache__? 阐明了 Python 解释器在执行 import 语句时自行创建该目录,因此该目录也将自行重新出现也就不足为奇了。

【讨论】:

    【解决方案2】:

    requirements.txt 你到底有什么?

    这个文件中是否有一些包创建了这个目录?因为 docker CLI 只能在为构建发送上下文之前忽略它,所以一旦构建开始(docker 基础镜像、pip 安装等在 dockerfile 中写入),那么 dockerignore 可能无法从 docker 镜像中忽略它。

    没有的话可以试试

    */db* -> 消除以 db 开头的文件,低于根目录, *sqlite3

    根据https://docs.docker.com/engine/reference/builder/,匹配是使用 Go 的 filepath.Match 规则完成的。 预处理步骤会删除前导和尾随空格并消除 .和 .. 使用 Go 的 filepath.Clean 的元素。预处理后空白的行将被忽略。

    在您的尝试中*/db.sqlite3db.sqlite3,可能 . 如上所述被消除,因此无法从构建中删除请求的文件。

    【讨论】:

      猜你喜欢
      • 2019-07-14
      • 2018-06-29
      • 2022-11-28
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 2018-09-17
      • 1970-01-01
      • 2022-06-22
      相关资源
      最近更新 更多