Riyad Mahrez had a penalty saved but Manchester City still sealed top spot in their Champions League group with a draw that also took Borussia Dortmund into the last 16.
Mahrez was fouled by Emre Can and stepped up himself, but Gregor Kobel went the right way to save his kick.
Both sides knew a draw would be enough to achieve their goals, so each will be happy with the result.
Manchester City boss Pep Guardiola surprisingly replaced top scorer Erling Haaland at half-time after just 13 touches in a half in which Mats Hummels dealt with him expertly.
Dortmund had good chances too, with 17-year-old Youssoufa Moukoko slotting wide and debutant City keeper Stefan Ortega making several saves.
Manchester City get job done but below best again
Manchester City will be happy to have won their Champions League group with a game to spare, but it is just one win in their past four games in all competitions now.
Last time out in Europe they drew 0-0 in Copenhagen, and then lost their unbeaten record to Liverpool in the league – before beating Brighton on Saturday.
Guardiola mixed things up with his line-up in Dortmund, giving a debut to 29-year-old keeper Ortega, a summer signing, with Ederson left on the bench.
The German did well to deny Karim Adeyemi and Moukoko in the first half.
Julian Alvarez, who played behind Haaland, made his fourth start for the club, and was one of only three players to test Kobel – along with Ilkay Gundogan and Mahrez with his failed penalty, all in the second half.
Nathan Ake headed a decent chance over too.
Mahrez has now missed three of his last four penalties for City in all competitions, after scoring nine of his first 10.
Manchester City have failed to convert 25 of their 80 penalties under Guardiola. No Premier League team have missed more penalties in that time.
Maybe if Haaland, with 22 goals in his first three months at City, was still on, he might have taken it.
But he was replaced after a quiet first half. Perhaps Guardiola is saving him for the game at struggling Leicester at the weekend.
Joao Cancelo was taken off too, another player who will not be happy with his first half – with Adeyemi getting the better of him on several occasions out wide.
It is all ultimately academic, with City topping the group amid a relentless pre-World Cup fixture list – but recent performances continue to dip below their early-season swashbuckling form.