.dockerignore:一些文件被忽略,有些则不被忽略

时间:2020-08-25 03:15:36

标签: django docker docker-compose

问题

嗨,我是Docker的新手。我想在Django项目中使用 .dockerignore 忽略某些文件和目录。最初,没有文件被忽略,然后我在stackoverflow中进行搜索,发现它是由于 docker-compose.yml 中的卷所致,因此我将其注释掉。但是现在,有些文件和目录被忽略了,但有些却未被忽略( 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

2 个答案:

答案 0 :(得分:1)

requirements.txt中到底有什么?

此文件中是否存在创建此目录的软件包?因为Docker CLI只能在发送构建上下文之前忽略它,所以一旦构建开始(docker基本映像,pip安装等,如dockerfile中所写),则dockerignore可能无法从docker映像中忽略它。

否则请尝试

*/db*->消除从db根目录下一级开始的文件, *sqlite3

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

在您尝试*/db.sqlite3 db.sqlite3时,也许被删除,因此无法从构建中删除请求的文件。

答案 1 :(得分:1)

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

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

docker run --rm 0123456789ab ls

如果您以这种方式进行一些探索,您应该看到容器中的__pycache__目录完全不存在或与主机不同。

在您提到的特定文件中,db.sqlite3文件是您实际应用程序的数据库,它将在您启动应用程序时创建;因此,如果您docker exec进入正在运行的容器,却没有看到docker run来自图像的干净容器,则看不到它。 enter image description here阐明了Python解释器在执行import语句时会自行创建该目录,因此该目录也将重新出现也就不足为奇了。

相关问题