{"record":{"id":"da1a4f760d5d78d6","repo":"testcontainers/testcontainers-java","slug":"overriding-previous-mapping-for","errorCode":null,"errorMessage":"overriding previous mapping for '{}'","messagePattern":"overriding previous mapping for '(.+?)'","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"core/src/main/java/org/testcontainers/images/builder/ImageFromDockerfile.java","lineNumber":90,"sourceCode":"    public ImageFromDockerfile() {\n        this(\"localhost/testcontainers/\" + Base58.randomString(16).toLowerCase());\n    }\n\n    public ImageFromDockerfile(String dockerImageName) {\n        this(dockerImageName, true);\n    }\n\n    public ImageFromDockerfile(String dockerImageName, boolean deleteOnExit) {\n        this.dockerImageName = dockerImageName;\n        this.deleteOnExit = deleteOnExit;\n    }\n\n    @Override\n    public ImageFromDockerfile withFileFromTransferable(String path, Transferable transferable) {\n        Transferable oldValue = transferables.put(path, transferable);\n\n        if (oldValue != null) {\n            log.warn(\"overriding previous mapping for '{}'\", path);\n        }\n\n        return this;\n    }\n\n    @Override\n    protected final String resolve() {\n        Logger logger = DockerLoggerFactory.getLogger(dockerImageName);\n\n        //noinspection resource\n        DockerClient dockerClient = DockerClientFactory.instance().client();\n\n        try {\n            BuildImageResultCallback resultCallback = new BuildImageResultCallback() {\n                @Override\n                public void onNext(BuildResponseItem item) {\n                    super.onNext(item);\n","sourceCodeStart":72,"sourceCodeEnd":108,"githubUrl":"https://github.com/testcontainers/testcontainers-java/blob/8e549514e3f01c57d70546fbb8599d138f3903e5/core/src/main/java/org/testcontainers/images/builder/ImageFromDockerfile.java#L72-L108","documentation":"ImageFromDockerfile.withFileFromTransferable stores files to copy into the image build context in a map keyed by path. If you register a second Transferable under a path that already has one, the previous entry is silently replaced and only a WARN is logged. The build proceeds with the last registered file.","triggerScenarios":"Calling withFileFromTransferable(path, ...) (or convenience methods like withFileFromString/withFileFromClasspath) twice with the same path string on the same ImageFromDockerfile instance.","commonSituations":"Building images in loops where the same destination path (e.g. /app/config.yml) is reused across iterations; copying framework helpers that internally register a file at a path the user also uses.","solutions":["Use a unique destination path for each withFileFromTransferable call","If overriding is intentional, ignore the warning or restructure so each build has a fresh ImageFromDockerfile instance","Remove or conditionalize the earlier registration if the first file is truly unwanted"],"exampleFix":"// before\nimage.withFileFromString(\"/app/conf.txt\", \"old\").withFileFromString(\"/app/conf.txt\", \"new\");\n// after\nimage.withFileFromString(\"/app/conf.txt\", \"new\");","handlingStrategy":"validation","validationCode":"Set<String> seen = new HashSet<>();\nvoid addFile(ImageFromDockerfile image, String path, String content) {\n    if (!seen.add(path)) {\n        throw new IllegalStateException(\"Duplicate path registered: \" + path);\n    }\n    image.withFileFromString(path, content);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Track destination paths when building images programmatically","Use unique destination paths per file","Create a fresh ImageFromDockerfile per build instead of reusing instances"],"tags":["dockerfile","image-build","duplicate-key","non-fatal"],"backgroundTag":"duplicate-mapping-overridden","analyzedSha":"8e549514e3f01c57d70546fbb8599d138f3903e5","analyzedAt":"2026-09-12T14:56:41.227Z","contentChangedAt":"2026-09-12T14:56:41.227Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}