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

tas*_*f99 3 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

.dockerignore

# Byte-compiled / optimized / DLL files
__pycache__/

**/migrations
src/media
src/db.sqlite3
Procfile
.git
Run Code Online (Sandbox Code Playgroud)

命令

# 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
Run Code Online (Sandbox Code Playgroud)

预期产出

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

**/migrations # ignored
src/media # ignored
src/db.sqlite3 # ignored
Procfile # ignored
.git # ignored
Run Code Online (Sandbox Code Playgroud)

原始输出

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

**/migrations # ignored
src/media # ignored
src/db.sqlite3 # NOT ignored
Procfile # ignored
.git # ignored
Run Code Online (Sandbox Code Playgroud)

尝试

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

*/db.sqlite3
db.sqlite3
Run Code Online (Sandbox Code Playgroud)

Dav*_*aze 5

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

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

docker run --rm 0123456789ab ls
Run Code Online (Sandbox Code Playgroud)

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

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