Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WORKDIR is not cached by legacy builder with trailing slash #47627

Closed
roysc opened this issue Mar 25, 2024 · 3 comments · Fixed by #47723
Closed

WORKDIR is not cached by legacy builder with trailing slash #47627

roysc opened this issue Mar 25, 2024 · 3 comments · Fixed by #47723
Labels
area/builder/classic-builder Issues affecting the classic builder area/builder kind/bug Bugs are bugs. The cause may or may not be known at triage time so debugging may be needed. status/0-triage version/25.0

Comments

@roysc
Copy link

roysc commented Mar 25, 2024

Description

In a Dockerfile, when WORKDIR is used with a directory with a trailing slash, the resulting image is not cached if using the legacy builder.

Reproduce

  1. Create the following Dockerfile:
FROM alpine:latest
WORKDIR /root/
  1. Run DOCKER_BUILDKIT=0 docker build . -t test:
% DOCKER_BUILDKIT=0 docker build . -t test 
DEPRECATED: The legacy builder is deprecated and will be removed in a future release.
            BuildKit is currently disabled; enable it by removing the DOCKER_BUILDKIT=0
            environment-variable.

Sending build context to Docker daemon   5.12kB
Step 1/2 : FROM alpine:latest
 ---> f6648c04cd6c
Step 2/2 : WORKDIR /root/
 ---> Running in 34a640348602
 ---> Removed intermediate container 34a640348602
 ---> 6224b443d3a9
Successfully built 6224b443d3a9
Successfully tagged test:latest
  1. Run it again. This creates a new image after the WORKDIR instruction:
% DOCKER_BUILDKIT=0 docker build . -t test
DEPRECATED: The legacy builder is deprecated and will be removed in a future release.
            BuildKit is currently disabled; enable it by removing the DOCKER_BUILDKIT=0
            environment-variable.

Sending build context to Docker daemon   5.12kB
Step 1/2 : FROM alpine:latest
 ---> f6648c04cd6c
Step 2/2 : WORKDIR /root/
 ---> Running in fa916b3ccf1c
 ---> Removed intermediate container fa916b3ccf1c
 ---> 9d1efadc4384
Successfully built 9d1efadc4384
Successfully tagged test:latest

Expected behavior

During the second run, Step 2/2 should use the cached image 6224b443d3a9.

docker version

Client:
 Cloud integration: v1.0.35+desktop.11
 Version:           25.0.3
 API version:       1.44
 Go version:        go1.21.6
 Git commit:        4debf41
 Built:             Tue Feb  6 21:13:26 2024
 OS/Arch:           darwin/arm64
 Context:           desktop-linux

Server: Docker Desktop 4.28.0 (139021)
 Engine:
  Version:          25.0.3
  API version:      1.44 (minimum version 1.24)
  Go version:       go1.21.6
  Git commit:       f417435
  Built:            Tue Feb  6 21:14:22 2024
  OS/Arch:          linux/arm64
  Experimental:     false
 containerd:
  Version:          1.6.28
  GitCommit:        ae07eda36dd25f8a1b98dfbf587313b99c0190bb
 runc:
  Version:          1.1.12
  GitCommit:        v1.1.12-0-g51d5e94
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

docker info

Client:
 Version:    25.0.3
 Context:    desktop-linux
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.12.1-desktop.4
    Path:     /Users/roy/.docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.24.6-desktop.1
    Path:     /Users/roy/.docker/cli-plugins/docker-compose
  debug: Get a shell into any image or container. (Docker Inc.)
    Version:  0.0.24
    Path:     /Users/roy/.docker/cli-plugins/docker-debug
  dev: Docker Dev Environments (Docker Inc.)
    Version:  v0.1.0
    Path:     /Users/roy/.docker/cli-plugins/docker-dev
  extension: Manages Docker extensions (Docker Inc.)
    Version:  v0.2.22
    Path:     /Users/roy/.docker/cli-plugins/docker-extension
  feedback: Provide feedback, right in your terminal! (Docker Inc.)
    Version:  v1.0.4
    Path:     /Users/roy/.docker/cli-plugins/docker-feedback
  init: Creates Docker-related starter files for your project (Docker Inc.)
    Version:  v1.0.1
    Path:     /Users/roy/.docker/cli-plugins/docker-init
  sbom: View the packaged-based Software Bill Of Materials (SBOM) for an image (Anchore Inc.)
    Version:  0.6.0
    Path:     /Users/roy/.docker/cli-plugins/docker-sbom
  scout: Docker Scout (Docker Inc.)
    Version:  v1.5.0
    Path:     /Users/roy/.docker/cli-plugins/docker-scout
WARNING: Plugin "/Users/roy/.docker/cli-plugins/docker-scan" is not valid: failed to fetch metadata: fork/exec /Users/roy/.docker/cli-plugins/docker-scan: no such file or directory

Server:
 Containers: 9
  Running: 8
  Paused: 0
  Stopped: 1
 Images: 491
 Server Version: 25.0.3
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: ae07eda36dd25f8a1b98dfbf587313b99c0190bb
 runc version: v1.1.12-0-g51d5e94
 init version: de40ad0
 Security Options:
  seccomp
   Profile: unconfined
  cgroupns
 Kernel Version: 6.6.16-linuxkit
 Operating System: Docker Desktop
 OSType: linux
 Architecture: aarch64
 CPUs: 10
 Total Memory: 11.67GiB
 Name: docker-desktop
 ID: d5458da4-6539-492c-aa92-1e4b8a63110e
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 HTTP Proxy: http.docker.internal:3128
 HTTPS Proxy: http.docker.internal:3128
 No Proxy: hubproxy.docker.internal
 Experimental: false
 Insecure Registries:
  hubproxy.docker.internal:5555
  127.0.0.0/8
 Live Restore Enabled: false

WARNING: daemon is not using the default seccomp profile

Additional Info

No response

@roysc roysc added kind/bug Bugs are bugs. The cause may or may not be known at triage time so debugging may be needed. status/0-triage labels Mar 25, 2024
@roysc
Copy link
Author

roysc commented Apr 10, 2024

Maybe related? #30081

@thaJeztah
Copy link
Member

That's a really old issue, so not sure if related. My initial thought would be (possibly) the logic here;

moby/image/cache/compare.go

Lines 137 to 139 in e8496b1

if a.WorkingDir != b.WorkingDir {
return false
}

It's possible the that path gets normalised somewhere (trailing slash removed/added as part of that), and possibly therefore the comparison not matching.

@vvoland any idea if that could be the case?

@vvoland
Copy link
Contributor

vvoland commented Apr 16, 2024

I took a quick look and found out that the SetupWorkingDirectory did a filepath.Clean and stored the result in the container config directly, which caused a cleaned path to be stored.

Opened a PR to remove that side effect.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/builder/classic-builder Issues affecting the classic builder area/builder kind/bug Bugs are bugs. The cause may or may not be known at triage time so debugging may be needed. status/0-triage version/25.0
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants