0.272 client broke direct image deployment without change in fly.toml

flyctl deploy --image registry.fly.io/xyz:latest --remote-only --verbose
Update available 0.0.270 -> v0.0.272.
Run "flyctl version update" to upgrade.
Deploying xyz 
==> Validating app configuration
--> Validating app configuration done
Searching for image 'registry.fly.io/xyz:latest' remotely...
image found: img_...
Image: registry.fly.io/xyz:latest
Image size: 24 MB
==> Creating release
Release v29 created

You can detach the terminal anytime without stopping the deployment
Monitoring Deployment

1 desired, 1 placed, 1 healthy, 0 unhealthy
v29 running - Deployment is running
...
flyctl deploy --image registry.fly.io/xyz:latest --remote-only --verbose
==> Verifying app config
--> Verified app config
==> Building image
Searching for image 'registry.fly.io/xyz:latest' remotely...
image found: img_...
==> Creating release
Error Services [0] Internal port can't be blank
app = "xyz"

kill_signal = "SIGTERM"
kill_timeout = 30

[build]
image = "registry.fly.io/xyz:latest"


[env]
  RUST_LOG = "xyz=trace,debug"

[experimental]
  allowed_public_ports = []
  auto_rollback = true

[[services]]
  internal_port = [8080]
  http_checks = []
  protocol = "tcp"
  script_checks = []

  [services.concurrency]
    hard_limit = 300000
    soft_limit = 290000
    type = "connections"

  [[services.ports]]
    handlers = ["http"]
    port = 80

  [[services.ports]]
    handlers = ["tls", "http"]
    port = 443

maybe a requirement or some parser detail changed between those version?

Can you try setting the internal port just to 8080? It’s possible that setting internal_port worked with an array before, but it should be set to a number.

Yep, that does the trick. Thanks!