Skip to content

ADD {URL} /target/ will only add file if URL contains supported file ending #3476

@k0pernikus

Description

@k0pernikus

Description

These link point (as of this writing) to the same file:

curl -I https://pecl.php.net/get/amqp-2.1.2.tgz && curl -I  https://pecl.php.net/get/amqp
HTTP/2 200
server: myracloud
date: Tue, 07 Oct 2025 15:03:15 GMT
content-type: application/octet-stream
content-length: 118454
set-cookie: PHPSESSID=5elvgvco9l5n69rcgldmr8ba24; path=/
expires: Thu, 19 Nov 1981 08:52:00 GMT
cache-control: no-store, no-cache, must-revalidate
pragma: no-cache
content-disposition: attachment;filename=amqp-2.1.2.tgz
last-modified: Mon, 22 Jan 2024 10:49:51 GMT
etag: "1ceb6-63d8186bf87f4"

HTTP/2 200
server: myracloud
date: Tue, 07 Oct 2025 15:03:15 GMT
content-type: application/octet-stream
content-length: 118454
set-cookie: PHPSESSID=3negi6em2990np8i0143cuavnl; path=/
expires: Thu, 19 Nov 1981 08:52:00 GMT
cache-control: no-store, no-cache, must-revalidate
pragma: no-cache
content-disposition: attachment;filename=amqp-2.1.2.tgz
last-modified: Mon, 22 Jan 2024 10:49:51 GMT
etag: "1ceb6-63d8186bf87f4"

yet only

ADD https://pecl.php.net/get/amqp-2.1.2.tgz /download/direct/

will be added while this won't be added:

ADD https://pecl.php.net/get/amqp /download/file-header

During the build, there is no error or feedback that no file was actually added.

Further confusion

I was under the assumption that ADD would both download the file and extract its content to the target.

This only happens on LOCAL files. Remote files are only downloaded. This is documented, but also very counterintuitive, as again: the log does not give any insight to the bevavior.

It is documented, but very confusing.

Reproduce

git clone [email protected]:k0pernikus/docker-build-beahvior-for-add.git
cd docker-build-beahvior-for-add/
 docker --version && DOCKER_BUILDKIT=1 docker build . --no-cache  --progress=plain
Docker version 28.5.0, build 887030f
#0 building with "default" instance using docker driver

docker/cli#1 [internal] load build definition from Dockerfile
docker/cli#1 transferring dockerfile: 334B done
docker/cli#1 DONE 0.0s

docker/cli#2 [internal] load metadata for docker.io/library/alpine:latest
docker/cli#2 DONE 1.0s

docker/cli#3 [internal] load .dockerignore
docker/cli#3 transferring context: 2B done
docker/cli#3 DONE 0.0s

docker/cli#4 [internal] load build context
docker/cli#4 DONE 0.0s

docker/cli#5 [1/7] FROM docker.io/library/alpine:latest@sha256:4bcff63911fcb4448bd4fdacec207030997caf25e9bea4045fa6c8c44de311d1
docker/cli#5 CACHED

docker/cli#6 [2/7] RUN apk add tree
docker/cli#6 ...

docker/cli#7 [5/7] ADD https://pecl.php.net/get/amqp /download/file-header
docker/cli#7 DONE 0.2s

docker/cli#8 [4/7] ADD https://pecl.php.net/get/amqp-2.1.2.tgz /download/direct/
docker/cli#8 CACHED

docker/cli#7 [5/7] ADD https://pecl.php.net/get/amqp /download/file-header
docker/cli#7 CACHED

docker/cli#4 [internal] load build context
docker/cli#4 transferring context: 37B done
docker/cli#4 DONE 0.0s

docker/cli#6 [2/7] RUN apk add tree
docker/cli#6 0.255 fetch https://dl-cdn.alpinelinux.org/alpine/v3.22/main/x86_64/APKINDEX.tar.gz
docker/cli#6 0.429 fetch https://dl-cdn.alpinelinux.org/alpine/v3.22/community/x86_64/APKINDEX.tar.gz
docker/cli#6 0.860 (1/1) Installing tree (2.2.1-r0)
docker/cli#6 0.879 Executing busybox-1.37.0-r18.trigger
docker/cli#6 0.886 OK: 7 MiB in 17 packages
docker/cli#6 DONE 1.0s

docker/cli#9 [3/7] RUN mkdir /download
docker/cli#9 DONE 0.5s

docker/cli#10 [4/7] ADD https://pecl.php.net/get/amqp-2.1.2.tgz /download/direct/
docker/cli#10 DONE 0.0s

docker/cli#11 [5/7] ADD https://pecl.php.net/get/amqp /download/file-header
docker/cli#11 DONE 0.0s

docker/cli#12 [6/7] ADD amqp-2.1.2.tgz /download/local-amqp
docker/cli#12 DONE 0.1s

docker/cli#13 [7/7] RUN tree /download/
docker/cli#13 0.412 /download/
docker/cli#13 0.413 ├── direct
docker/cli#13 0.413 │   └── amqp-2.1.2.tgz
docker/cli#13 0.413 ├── file-header
docker/cli#13 0.413 └── local-amqp
docker/cli#13 0.413     ├── amqp-2.1.2
docker/cli#13 0.413     │   ├── CREDITS
docker/cli#13 0.413     │   ├── LICENSE
docker/cli#13 0.413     │   ├── amqp.c
docker/cli#13 0.413     │   ├── amqp_basic_properties.c
docker/cli#13 0.413     │   ├── amqp_basic_properties.h
docker/cli#13 0.413     │   ├── amqp_channel.c
docker/cli#13 0.413     │   ├── amqp_channel.h
docker/cli#13 0.413     │   ├── amqp_connection.c
docker/cli#13 0.413     │   ├── amqp_connection.h
docker/cli#13 0.413     │   ├── amqp_connection_resource.c
docker/cli#13 0.413     │   ├── amqp_connection_resource.h
docker/cli#13 0.413     │   ├── amqp_decimal.c
docker/cli#13 0.413     │   ├── amqp_decimal.h
docker/cli#13 0.413     │   ├── amqp_envelope.c
docker/cli#13 0.413     │   ├── amqp_envelope.h
docker/cli#13 0.413     │   ├── amqp_envelope_exception.c
docker/cli#13 0.413     │   ├── amqp_envelope_exception.h
docker/cli#13 0.413     │   ├── amqp_exchange.c
docker/cli#13 0.413     │   ├── amqp_exchange.h
docker/cli#13 0.413     │   ├── amqp_methods_handling.c
docker/cli#13 0.413     │   ├── amqp_methods_handling.h
docker/cli#13 0.413     │   ├── amqp_queue.c
docker/cli#13 0.413     │   ├── amqp_queue.h
docker/cli#13 0.413     │   ├── amqp_timestamp.c
docker/cli#13 0.413     │   ├── amqp_timestamp.h
docker/cli#13 0.413     │   ├── amqp_type.c
docker/cli#13 0.413     │   ├── amqp_type.h
docker/cli#13 0.413     │   ├── amqp_value.c
docker/cli#13 0.413     │   ├── amqp_value.h
docker/cli#13 0.413     │   ├── benchmark.php
docker/cli#13 0.413     │   ├── config.m4
docker/cli#13 0.413     │   ├── config.w32
docker/cli#13 0.413     │   ├── php_amqp.h
docker/cli#13 0.413     │   ├── php_amqp_version.h
docker/cli#13 0.413     │   ├── stubs
docker/cli#13 0.413     │   │   ├── AMQP.php
docker/cli#13 0.413     │   │   ├── AMQPBasicProperties.php
docker/cli#13 0.413     │   │   ├── AMQPChannel.php
docker/cli#13 0.413     │   │   ├── AMQPChannelException.php
docker/cli#13 0.413     │   │   ├── AMQPConnection.php
docker/cli#13 0.413     │   │   ├── AMQPConnectionException.php
docker/cli#13 0.413     │   │   ├── AMQPDecimal.php
docker/cli#13 0.413     │   │   ├── AMQPEnvelope.php
docker/cli#13 0.413     │   │   ├── AMQPEnvelopeException.php
docker/cli#13 0.413     │   │   ├── AMQPException.php
docker/cli#13 0.413     │   │   ├── AMQPExchange.php
docker/cli#13 0.413     │   │   ├── AMQPExchangeException.php
docker/cli#13 0.415     │   │   ├── AMQPQueue.php
docker/cli#13 0.415     │   │   ├── AMQPQueueException.php
docker/cli#13 0.415     │   │   ├── AMQPTimestamp.php
docker/cli#13 0.415     │   │   ├── AMQPValue.php
docker/cli#13 0.415     │   │   └── AMQPValueException.php
docker/cli#13 0.415     │   └── tests
docker/cli#13 0.415     │       ├── 003-channel-consumers.phpt
docker/cli#13 0.415     │       ├── 004-queue-consume-nested.phpt
docker/cli#13 0.415     │       ├── 004-queue-consume-orphaned.phpt
docker/cli#13 0.415     │       ├── _test_helpers.php.inc
docker/cli#13 0.415     │       ├── amqp_version.phpt
docker/cli#13 0.415     │       ├── amqpbasicproperties.phpt
docker/cli#13 0.415     │       ├── amqpbasicproperties_nullability.phpt
docker/cli#13 0.415     │       ├── amqpchannel_basicRecover.phpt
docker/cli#13 0.415     │       ├── amqpchannel_close.phpt
docker/cli#13 0.415     │       ├── amqpchannel_confirmSelect.phpt
docker/cli#13 0.415     │       ├── amqpchannel_construct_basic.phpt
docker/cli#13 0.415     │       ├── amqpchannel_construct_ini_global_prefetch_count.phpt
docker/cli#13 0.415     │       ├── amqpchannel_construct_ini_global_prefetch_size.phpt
docker/cli#13 0.415     │       ├── amqpchannel_construct_ini_prefetch_count.phpt
docker/cli#13 0.415     │       ├── amqpchannel_construct_ini_prefetch_size.phpt
docker/cli#13 0.415     │       ├── amqpchannel_getChannelId.phpt
docker/cli#13 0.415     │       ├── amqpchannel_get_connection.phpt
docker/cli#13 0.415     │       ├── amqpchannel_multi_channel_connection.phpt
docker/cli#13 0.415     │       ├── amqpchannel_set_global_prefetch_count.phpt
docker/cli#13 0.415     │       ├── amqpchannel_set_global_prefetch_size.phpt
docker/cli#13 0.415     │       ├── amqpchannel_set_prefetch_and_global_prefetch_count.phpt
docker/cli#13 0.415     │       ├── amqpchannel_set_prefetch_and_global_prefetch_size.phpt
docker/cli#13 0.415     │       ├── amqpchannel_set_prefetch_count.phpt
docker/cli#13 0.415     │       ├── amqpchannel_set_prefetch_size.phpt
docker/cli#13 0.415     │       ├── amqpchannel_slots_usage.phpt
docker/cli#13 0.415     │       ├── amqpchannel_validation.phpt
docker/cli#13 0.415     │       ├── amqpchannel_var_dump.phpt
docker/cli#13 0.415     │       ├── amqpconnection_connect_login_failure.phpt
docker/cli#13 0.415     │       ├── amqpconnection_connection_getters.phpt
docker/cli#13 0.415     │       ├── amqpconnection_construct_basic.phpt
docker/cli#13 0.415     │       ├── amqpconnection_construct_ini_read_timeout.phpt
docker/cli#13 0.415     │       ├── amqpconnection_construct_ini_timeout.phpt
docker/cli#13 0.415     │       ├── amqpconnection_construct_ini_timeout_and_read_timeout.phpt
docker/cli#13 0.415     │       ├── amqpconnection_construct_ini_timeout_default.phpt
docker/cli#13 0.415     │       ├── amqpconnection_construct_params_by_value.phpt
docker/cli#13 0.415     │       ├── amqpconnection_construct_with_connect_timeout.phpt
docker/cli#13 0.415     │       ├── amqpconnection_construct_with_connection_name.phpt
docker/cli#13 0.415     │       ├── amqpconnection_construct_with_limits.phpt
docker/cli#13 0.415     │       ├── amqpconnection_construct_with_rpc_timeout.phpt
docker/cli#13 0.415     │       ├── amqpconnection_construct_with_timeout.phpt
docker/cli#13 0.415     │       ├── amqpconnection_construct_with_timeout_and_read_timeout.phpt
docker/cli#13 0.415     │       ├── amqpconnection_construct_with_verify_false.phpt
docker/cli#13 0.415     │       ├── amqpconnection_construct_with_write_timeout.phpt
docker/cli#13 0.415     │       ├── amqpconnection_getUsedChannels.phpt
docker/cli#13 0.415     │       ├── amqpconnection_heartbeat.phpt
docker/cli#13 0.415     │       ├── amqpconnection_heartbeat_with_consumer.phpt
docker/cli#13 0.415     │       ├── amqpconnection_heartbeat_with_persistent.phpt
docker/cli#13 0.415     │       ├── amqpconnection_nullable_setters.phpt
docker/cli#13 0.415     │       ├── amqpconnection_persistent_construct_basic.phpt
docker/cli#13 0.415     │       ├── amqpconnection_persistent_in_use.phpt
docker/cli#13 0.415     │       ├── amqpconnection_persistent_reusable.phpt
docker/cli#13 0.415     │       ├── amqpconnection_setConnectionName.phpt
docker/cli#13 0.415     │       ├── amqpconnection_setHost.phpt
docker/cli#13 0.415     │       ├── amqpconnection_setLogin.phpt
docker/cli#13 0.415     │       ├── amqpconnection_setPassword.phpt
docker/cli#13 0.415     │       ├── amqpconnection_setPort_int.phpt
docker/cli#13 0.415     │       ├── amqpconnection_setPort_out_of_range.phpt
docker/cli#13 0.415     │       ├── amqpconnection_setPort_string.phpt
docker/cli#13 0.415     │       ├── amqpconnection_setReadTimeout_float.phpt
docker/cli#13 0.415     │       ├── amqpconnection_setReadTimeout_int.phpt
docker/cli#13 0.415     │       ├── amqpconnection_setReadTimeout_out_of_range.phpt
docker/cli#13 0.415     │       ├── amqpconnection_setReadTimeout_string.phpt
docker/cli#13 0.415     │       ├── amqpconnection_setRpcTimeout_float.phpt
docker/cli#13 0.415     │       ├── amqpconnection_setRpcTimeout_int.phpt
docker/cli#13 0.415     │       ├── amqpconnection_setRpcTimeout_out_of_range.phpt
docker/cli#13 0.415     │       ├── amqpconnection_setRpcTimeout_string.phpt
docker/cli#13 0.415     │       ├── amqpconnection_setSaslMethod.phpt
docker/cli#13 0.415     │       ├── amqpconnection_setSaslMethod_invalid.phpt
docker/cli#13 0.415     │       ├── amqpconnection_setTimeout_deprecated.phpt
docker/cli#13 0.415     │       ├── amqpconnection_setTimeout_float.phpt
docker/cli#13 0.415     │       ├── amqpconnection_setTimeout_int.phpt
docker/cli#13 0.415     │       ├── amqpconnection_setTimeout_out_of_range.phpt
docker/cli#13 0.415     │       ├── amqpconnection_setTimeout_string.phpt
docker/cli#13 0.415     │       ├── amqpconnection_setVhost.phpt
docker/cli#13 0.415     │       ├── amqpconnection_setWriteTimeout_float.phpt
docker/cli#13 0.416     │       ├── amqpconnection_setWriteTimeout_int.phpt
docker/cli#13 0.416     │       ├── amqpconnection_setWriteTimeout_out_of_range.phpt
docker/cli#13 0.416     │       ├── amqpconnection_setWriteTimeout_string.phpt
docker/cli#13 0.416     │       ├── amqpconnection_tls_basic.phpt
docker/cli#13 0.416     │       ├── amqpconnection_tls_mtls.phpt
docker/cli#13 0.416     │       ├── amqpconnection_tls_sasl.phpt
docker/cli#13 0.416     │       ├── amqpconnection_toomanychannels.phpt
docker/cli#13 0.416     │       ├── amqpconnection_validation.phpt
docker/cli#13 0.416     │       ├── amqpconnection_var_dump.phpt
docker/cli#13 0.416     │       ├── amqpdecimal.phpt
docker/cli#13 0.416     │       ├── amqpenvelope_construct.phpt
docker/cli#13 0.416     │       ├── amqpenvelope_get_accessors.phpt
docker/cli#13 0.416     │       ├── amqpenvelope_var_dump.phpt
docker/cli#13 0.416     │       ├── amqpexchange-declare-segfault.phpt
docker/cli#13 0.416     │       ├── amqpexchange_attributes.phpt
docker/cli#13 0.416     │       ├── amqpexchange_bind.phpt
docker/cli#13 0.416     │       ├── amqpexchange_bind_with_arguments.phpt
docker/cli#13 0.416     │       ├── amqpexchange_bind_without_key.phpt
docker/cli#13 0.416     │       ├── amqpexchange_bind_without_key_with_arguments.phpt
docker/cli#13 0.416     │       ├── amqpexchange_channel_refcount.phpt
docker/cli#13 0.416     │       ├── amqpexchange_construct_basic.phpt
docker/cli#13 0.416     │       ├── amqpexchange_declare_basic.phpt
docker/cli#13 0.416     │       ├── amqpexchange_declare_existent.phpt
docker/cli#13 0.416     │       ├── amqpexchange_declare_with_stalled_reference.phpt
docker/cli#13 0.416     │       ├── amqpexchange_declare_without_name.phpt
docker/cli#13 0.416     │       ├── amqpexchange_declare_without_type.phpt
docker/cli#13 0.416     │       ├── amqpexchange_delete_default_exchange.phpt
docker/cli#13 0.416     │       ├── amqpexchange_delete_null_name.phpt
docker/cli#13 0.416     │       ├── amqpexchange_get_channel.phpt
docker/cli#13 0.416     │       ├── amqpexchange_get_connection.phpt
docker/cli#13 0.416     │       ├── amqpexchange_invalid_type.phpt
docker/cli#13 0.416     │       ├── amqpexchange_name.phpt
docker/cli#13 0.416     │       ├── amqpexchange_publish_basic.phpt
docker/cli#13 0.416     │       ├── amqpexchange_publish_confirms.phpt
docker/cli#13 0.416     │       ├── amqpexchange_publish_confirms_consume.phpt
docker/cli#13 0.416     │       ├── amqpexchange_publish_empty_routing_key.phpt
docker/cli#13 0.416     │       ├── amqpexchange_publish_mandatory.phpt
docker/cli#13 0.416     │       ├── amqpexchange_publish_mandatory_consume.phpt
docker/cli#13 0.416     │       ├── amqpexchange_publish_mandatory_multiple_channels_pitfall.phpt
docker/cli#13 0.416     │       ├── amqpexchange_publish_null_routing_key.phpt
docker/cli#13 0.416     │       ├── amqpexchange_publish_with_decimal_header.phpt
docker/cli#13 0.416     │       ├── amqpexchange_publish_with_null.phpt
docker/cli#13 0.416     │       ├── amqpexchange_publish_with_properties.phpt
docker/cli#13 0.416     │       ├── amqpexchange_publish_with_properties_ignore_num_header.phpt
docker/cli#13 0.416     │       ├── amqpexchange_publish_with_properties_ignore_unsupported_header_values.phpt
docker/cli#13 0.416     │       ├── amqpexchange_publish_with_properties_nested_header.phpt
docker/cli#13 0.416     │       ├── amqpexchange_publish_with_properties_user_id_failure.phpt
docker/cli#13 0.416     │       ├── amqpexchange_publish_with_timestamp_header.phpt
docker/cli#13 0.416     │       ├── amqpexchange_publish_xdeath.phpt
docker/cli#13 0.416     │       ├── amqpexchange_setArgument.phpt
docker/cli#13 0.416     │       ├── amqpexchange_set_flag.phpt
docker/cli#13 0.416     │       ├── amqpexchange_set_flags.phpt
docker/cli#13 0.416     │       ├── amqpexchange_type.phpt
docker/cli#13 0.416     │       ├── amqpexchange_unbind.phpt
docker/cli#13 0.416     │       ├── amqpexchange_unbind_with_arguments.phpt
docker/cli#13 0.416     │       ├── amqpexchange_unbind_without_key.phpt
docker/cli#13 0.416     │       ├── amqpexchange_unbind_without_key_with_arguments.phpt
docker/cli#13 0.416     │       ├── amqpexchange_var_dump.phpt
docker/cli#13 0.416     │       ├── amqpqueue-cancel-no-consumers.phpt
docker/cli#13 0.416     │       ├── amqpqueue_attributes.phpt
docker/cli#13 0.416     │       ├── amqpqueue_bind_basic.phpt
docker/cli#13 0.416     │       ├── amqpqueue_bind_basic_empty_routing_key.phpt
docker/cli#13 0.416     │       ├── amqpqueue_bind_basic_headers_arguments.phpt
docker/cli#13 0.416     │       ├── amqpqueue_bind_null_routing_key.phpt
docker/cli#13 0.416     │       ├── amqpqueue_cancel.phpt
docker/cli#13 0.416     │       ├── amqpqueue_construct_basic.phpt
docker/cli#13 0.416     │       ├── amqpqueue_consume_basic.phpt
docker/cli#13 0.416     │       ├── amqpqueue_consume_multiple.phpt
docker/cli#13 0.416     │       ├── amqpqueue_consume_multiple_no_doubles.phpt
docker/cli#13 0.416     │       ├── amqpqueue_consume_nonexistent.phpt
docker/cli#13 0.416     │       ├── amqpqueue_consume_null_consumer_key.phpt
docker/cli#13 0.416     │       ├── amqpqueue_consume_timeout.phpt
docker/cli#13 0.416     │       ├── amqpqueue_declare_basic.phpt
docker/cli#13 0.416     │       ├── amqpqueue_declare_with_arguments.phpt
docker/cli#13 0.416     │       ├── amqpqueue_declare_with_stalled_reference.phpt
docker/cli#13 0.416     │       ├── amqpqueue_delete_basic.phpt
docker/cli#13 0.416     │       ├── amqpqueue_empty_name.phpt
docker/cli#13 0.416     │       ├── amqpqueue_get_basic.phpt
docker/cli#13 0.416     │       ├── amqpqueue_get_channel.phpt
docker/cli#13 0.416     │       ├── amqpqueue_get_connection.phpt
docker/cli#13 0.416     │       ├── amqpqueue_get_empty_body.phpt
docker/cli#13 0.416     │       ├── amqpqueue_get_headers.phpt
docker/cli#13 0.416     │       ├── amqpqueue_get_nonexistent.phpt
docker/cli#13 0.416     │       ├── amqpqueue_headers_with_bool.phpt
docker/cli#13 0.416     │       ├── amqpqueue_headers_with_float.phpt
docker/cli#13 0.416     │       ├── amqpqueue_headers_with_null.phpt
docker/cli#13 0.416     │       ├── amqpqueue_nack.phpt
docker/cli#13 0.416     │       ├── amqpqueue_nested_arrays.phpt
docker/cli#13 0.416     │       ├── amqpqueue_nested_headers.phpt
docker/cli#13 0.416     │       ├── amqpqueue_purge_basic.phpt
docker/cli#13 0.416     │       ├── amqpqueue_recover.phpt
docker/cli#13 0.416     │       ├── amqpqueue_setArgument.phpt
docker/cli#13 0.416     │       ├── amqpqueue_setFlags.phpt
docker/cli#13 0.416     │       ├── amqpqueue_unbind_basic_empty_routing_key.phpt
docker/cli#13 0.416     │       ├── amqpqueue_unbind_basic_headers_arguments.phpt
docker/cli#13 0.416     │       ├── amqpqueue_var_dump.phpt
docker/cli#13 0.416     │       ├── amqptimestamp.phpt
docker/cli#13 0.416     │       ├── bug_17831.phpt
docker/cli#13 0.416     │       ├── bug_19707.phpt
docker/cli#13 0.416     │       ├── bug_19840.phpt
docker/cli#13 0.416     │       ├── bug_351.phpt
docker/cli#13 0.416     │       ├── bug_385.phpt
docker/cli#13 0.416     │       ├── bug_61533.phpt
docker/cli#13 0.416     │       ├── bug_62354.phpt
docker/cli#13 0.416     │       ├── bug_gh147.phpt
docker/cli#13 0.416     │       ├── bug_gh155_direct_reply_to.phpt
docker/cli#13 0.416     │       ├── bug_gh50-1.phpt
docker/cli#13 0.416     │       ├── bug_gh50-2.phpt
docker/cli#13 0.416     │       ├── bug_gh50-3.phpt
docker/cli#13 0.416     │       ├── bug_gh50-4.phpt
docker/cli#13 0.416     │       ├── bug_gh53-2.phpt
docker/cli#13 0.416     │       ├── bug_gh53.phpt
docker/cli#13 0.416     │       ├── bug_gh72-1.phpt
docker/cli#13 0.416     │       ├── bug_gh72-2.phpt
docker/cli#13 0.416     │       ├── ini_validation_failure.phpt
docker/cli#13 0.416     │       ├── package-version.phpt
docker/cli#13 0.416     │       ├── serialize-custom-amqpvalue-errors.phpt
docker/cli#13 0.416     │       ├── serialize-custom-amqpvalue.phpt
docker/cli#13 0.416     │       └── testtest.phpt
docker/cli#13 0.416     └── package.xml
docker/cli#13 0.416
docker/cli#13 0.416 6 directories, 248 files
docker/cli#13 DONE 0.4s

docker/cli#14 exporting to image
docker/cli#14 exporting layers 0.1s done
docker/cli#14 writing image sha256:f2febff512e6505ccf5e04976b0084fb096194966fd495c82863c95e8173eb8d done
docker/cli#14 DONE 0.1s

Expected behavior

Both

  • ADD https://pecl.php.net/get/amqp-2.1.2.tgz /download/direct/
  • ADD https://pecl.php.net/get/amqp /download/file-header

should add a file.

Ideally, there should be an option to have the .tgz (and any supported archive) be extracted as well as the local file is.

I assume you prevent the automatic extraction of remote files for security concerns, in practice we do wget / curl and untar the file anyway. So this feature is both confusing and gets in the way of current practices.

Yet main scope of this issue is that URL like https://pecl.php.net/get/amqp are discovered as a file and added.

If you don't want to support that, there should be an error (or at least a warning) since no file was added.

docker version

Client: Docker Engine - Community
 Version:           28.5.0
 API version:       1.51
 Go version:        go1.24.7
 Git commit:        887030f
 Built:             Thu Oct  2 14:54:28 2025
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          28.5.0
  API version:      1.51 (minimum version 1.24)
  Go version:       go1.24.7
  Git commit:       cd04830
  Built:            Thu Oct  2 14:54:28 2025
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.7.28
  GitCommit:        b98a3aace656320842a23f4a392a33f46af97866
 runc:
  Version:          1.3.0
  GitCommit:        v1.3.0-0-g4ca628d1
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

docker info

Client: Docker Engine - Community
 Version:    28.5.0
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.29.1
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.40.0
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 14
  Running: 7
  Paused: 0
  Stopped: 7
 Images: 40
 Server Version: 28.5.0
 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: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 CDI spec directories:
  /etc/cdi
  /var/run/cdi
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: b98a3aace656320842a23f4a392a33f46af97866
 runc version: v1.3.0-0-g4ca628d1
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
 Kernel Version: 5.15.153.1-microsoft-standard-WSL2
 Operating System: Ubuntu 24.04.3 LTS
 OSType: linux
 Architecture: x86_64
 CPUs: 14
 Total Memory: 15.36GiB
 Name: mst-nb-115
 ID: 17861055-c8e2-4210-9365-232537ab393d
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  ::1/128
  127.0.0.0/8
 Live Restore Enabled: false

Additional Info

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    kind/bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions