.dockerignore matching ignores filename case on Linux
Maintainer thường phản hồi trong vòng 4 ngày
Đánh giá
- Độ khó
- 2/5
- Thời gian dự kiến
- 1-3 giờ
- Mức phù hợp với người mới
- 82/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- docker, python
- Lĩnh vực
- build-system
Hướng nghiên cứu
Bắt đầu từ docker.utils.tar và mã pattern-matching mà nó gọi (docker/utils/build.py, các helper exclude) để xem vì sao README.md cũng khớp với readme.md trên Linux trong khi BuildKit vẫn giữ nó. Script reproduce-case.py của issue cung cấp cách kiểm chứng hành vi không cần daemon; hãy điều chỉnh nó thành một test bên cạnh các test build/tar hiện có trong tests/unit/utils_test.py. Xong nghĩa là loại trừ phân biệt chữ hoa chữ thường trên Linux, với reproducer cho thấy readme.md được giữ lại.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
🤖 this issue description was generated by an LLM. i reviewed it before submitting. 🤖
I used Codex for the investigation, reproduction scripts, and this draft.
When I generate a build context with docker.utils.tar, the pattern README.md removes both README.md and readme.md on Linux. Docker's BuildKit keeps readme.md with the same input. The SDK therefore removes a file that the Dockerfile could otherwise copy.
Reproduction
Save this script as reproduce-case.py:
import tarfile
from pathlib import Path
from tempfile import TemporaryDirectory
import docker
from docker.utils import tar
patterns = ['README.md']
files = ['README.md', 'readme.md']
with TemporaryDirectory() as directory:
root = Path(directory)
(root / 'Dockerfile').write_text('FROM scratch\nCOPY . /\n')
(root / '.dockerignore').write_text('\n'.join(patterns) + '\n')
for relative in files:
path = root / relative
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(relative)
with tar(str(root), exclude=patterns.copy()) as context:
with tarfile.open(fileobj=context) as archive:
actual = sorted(name for name in archive.getnames() if name in files)
print('docker:', docker.__version__)
print('patterns:', patterns)
print('SDK context files:', actual)
I ran it in an isolated uv environment, using commit 56343ddf8f0c44281e151c2dad016c16cdb8393d:
uv run --isolated --no-project --no-config --no-cache \
--python /home/jyn/.local/share/mise/installs/python/3.14.7/bin/python3 \
--with 'docker @ git+https://github.com/docker/docker-py@56343ddf8f0c44281e151c2dad016c16cdb8393d' \
python reproduce-case.py
The --python path selects my tested Python installation; use the path to your Python executable on another machine. The pinned requirement selects the upstream SDK rather than an installed copy. I did not modify the SDK or replace its modules with mocks. This reproducer creates disposable files and examines the SDK's context tar without contacting a Docker daemon.
Expected behavior
The SDK should exclude README.md and retain readme.md on Linux. I built the same two files with FROM scratch and COPY . / using BuildKit, and its local output retained readme.md.
Actual output
docker: 7.2.1.dev26+g56343ddf8
patterns: ['README.md']
SDK context files: []
BuildKit control
I ran the following standalone control with Docker's active lima context and lima builder. It creates the same input files, runs docker buildx build with a local filesystem export, and enumerates every exported regular file before removing the temporary directories. The command uses the active Docker context and builder; another machine can use its own working configuration.
Buildx command and exported-file inspection
Save this script as buildkit-control-case.py:
import subprocess
from pathlib import Path
from tempfile import TemporaryDirectory
patterns = ['README.md']
files = ['README.md', 'readme.md']
with TemporaryDirectory() as directory:
context = Path(directory) / 'input'
context.mkdir()
output = Path(directory) / 'output'
(context / 'Dockerfile').write_text('FROM scratch\nCOPY . /\n')
(context / '.dockerignore').write_text('\n'.join(patterns) + '\n')
for relative in files:
path = context / relative
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(relative)
subprocess.run([
'docker', 'buildx', 'build',
'--progress=plain', '--provenance=false',
'--output', f'type=local,dest={output}', str(context),
], check=True)
print('BuildKit output files:', sorted(
path.relative_to(output).as_posix()
for path in output.rglob('*') if path.is_file()
))
Run it with:
python3 buildkit-control-case.py
I got this stdout; Buildx wrote its progress log to stderr and exited successfully:
BuildKit output files: ['.dockerignore', 'Dockerfile', 'readme.md']
Environment
- Docker SDK for Python:
7.2.1.dev26+g56343ddf8, using upstream commit56343ddf8f0c44281e151c2dad016c16cdb8393d. - Python:
3.14.7 (main, Sep 29 2026, 15:01:40) [Clang 22.1.3 ]. - OS/distribution: CachyOS Linux, rolling release (
BUILD_ID=rolling;/etc/os-releasedoes not defineVERSION_ID). - Kernel/platform:
Linux-7.2.9-1-cachyos-x86_64-with-glibc2.44. - Docker CLI:
29.8.2; Docker Engine:29.8.0(linux/amd64). - Buildx:
github.com/docker/buildx 0.37.2 2d379c0c3f22da0d2759d132a0ec81ca949098f0. - The SDK tar reproducer requires no engine connection; the separate BuildKit comparison used the versions above.
- Ngôn ngữ chính
- Python
- Star
- 7.2k
- Fork
- 1.7k
- Merge trung bình
- 3 ngày 19 giờ
- Pull request đã merge (30 ngày)
- 1
Chuẩn bị môi trường
- Có Dockerfile hoặc tệp Docker Compose
- Không có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của docker/docker-py
-
Add `pull` to the list of kwargs to pass to create and runCó thể đã có người làm @zainnadeem786 đã nhận 130 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
docker/docker-py#3369 · 2 bình luận ·
Maintainer thường phản hồi trong vòng 4 ngày
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 68/100
Maintainer thường phản hồi trong vòng 4 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
docker/docker-py#2457 · 4 reaction ·
Maintainer thường phản hồi trong vòng 4 ngày
-
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 74/100
Maintainer thường phản hồi trong vòng 4 ngày
-
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 80/100
Maintainer thường phản hồi trong vòng 4 ngày
Tất cả issue của docker/docker-py
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 85/100
Maintainer thường phản hồi trong vòng 1 ngày
-
SR_SECURITY_DESCRIPTOR.fromString drops the SACL when no DACL is presentCó thể đã có người làm @paul7436 đã nhận hôm nay. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
Maintainer thường phản hồi trong vòng 2 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 85/100
equinor/fmu-sumo-uploader#302 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
modelscope/evalscope#1821 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Sanity on ansible-core devel fails: ignore-2.23.txt references the removed import-3.9 testCó thể đã có người làm @yurnov đã nhận hôm nay. Đang mởneeds_triage
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 91/100
ansible-collections/kubernetes.core#1275 ·
Maintainer thường phản hồi trong vòng 1 ngày