Uma das diferenças mais marcantes nesses dois comandos é que o RUN é executado ainda na criação do container enquanto o CMD é executado depois.
É importante pensar, por exemplo, que para a utilização de variáveis de ambiente o RUN não poderá ser utilizado uma vez que essas só serão setadas após a finalização da criação e execução do container.