Haaland, 21, will join in July after City activated a 60m euro (£51.2m) release clause in his contract.
The deal ends the club’s hunt for a successor to their all-time top scorer Sergio Aguero, who joined Barcelona on a free transfer last summer.
“We can confirm that we have reached an agreement in principle for the transfer of striker Erling Haaland,” City said.
“The transfer remains subject to the club finalising terms with the player.”
Haaland has scored 85 goals in 88 appearances for Dortmund since joining from Red Bull Salzburg in January 2020.
La Liga giants Real Madrid and Barcelona also spoke to Haaland about a potential deal, but he opted for a move to Etihad Stadium.
Speaking earlier on Tuesday, Manchester City boss Pep Guardiola said he could not discuss the incoming signing for legal reasons.
“Everybody knows the situation. I shouldn’t talk because I don’t like to talk about the future or next season,” he said.
When asked what impact a new number nine would have on the Premier League champions, Guardiola said: “New players always helps to be a stronger team. But not one defender or striker will solve our defensive or scoring problems.
“The club always has to have a vision for the future. The decisions the club makes I am aware and supportive of 100%.”
The transfer would be one of the biggest of the summer.
Sports agent Mino Raiola had been involved in the discussions prior to his death, with associates taking the process on to its conclusion.
Even though City are within touching distance of a second successive Premier League title achieved without an orthodox centre-forward, Guardiola has always stressed his desire to have one.
City tried hard to get Harry Kane from Tottenham last summer but Spurs chairman Daniel Levy refused to sell.
And, with Kane having two years left on his contract, Haaland is an easier deal to conclude given his release clause.
He has scored 92 league goals in 121 appearances for Molde, Red Bull Salzburg and Dortmund and last year became the youngest player to reach 20 Champions League goals.
Haaland’s father Alf-Inge played for City between 2000 and 2003 in a career that also saw him represent Leeds and Nottingham Forest.
Simon Stone, BBC Sport
City sources say the fee is actually 60m euros (£51.2m), not the 75m euros initially thought. And it is not all payable up front.
Haaland will sign for five seasons, to 2027, with no optional additional year as is the case with many contracts these days.
The wages are believed to be around £400,000 a week, roughly in line with what star midfielder Kevin de Bruyne is paid.
City maintain this is an exceptional deal for a player they believe is worth 200m euros in the current market and that it vindicates their decision to walk away from negotiations around Spurs striker Kane last summer.
BBC Sport has been told many of Europe’s top clubs wanted Haaland but a combination of the emotional appeal of playing for the club his father played for, plus the attraction of playing for Guardiola and being part of a squad that has challenged for all the major honours over the past five seasons were the decisive factors.