What are the properties of the circle packing you want?
You mention different radii - do you want to set a small number of specific radii? or a general range?
Do you care about the exact number of circles?
Are you looking for something topologically regular, or more random looking?
The script in the first definition above is a custom goal for collision between spheres of any radius and a curve. It can be used to get the circles tangent to the boundary, instead of their centres ending up on the boundary. As you found though, they can sometimes end up off the surface and outside the boundary altogether. Adding an OnMesh goal can be one way to avoid this.
Here’s that definition with a few small modifications:
circle_pack_perforation2.gh (15.2 KB)
For some examples of more regular distributions (mesh based instead of collision based), have a look at this recent thread: