Hello,
Here is how I do this with gmsh. Maybe it helps you. It is a two-dimensional code, however.
To apply neumann conditions (i.e. forces), I do
boundaries = MeshFunction("uint", mesh, mesh_input_file_base +"_facet_region.xml ")
force = Constant((1.0, 1.0))
# '4' is the number from the gmsh .geo file
L = inner(force, w)*ds(4, domain=mesh, subdomain_data=boundaries)
For Dirichlet conditions, your approach seems ok.
Is there a reason, why you want to apply boundary conditions to a volume. This is ok from a mathematical point of view, but I'm not sure why you want to do it. Also, in your example .geo file, you only define a single volume, i.e. the whole cube. So you would be applying specific displacements to the whole cube, which makes using a finite element code kindof pointless, because there is nothing left to solve.
In my opinion, it would make sense to first figure out if you actually need volume boundary conditions. I sometimes do, but never from gmsh input. If you decide that you realy need them (from gmsh input), then you should try to define something other than the whole cube as your volume. You should be able to simply open your .geo file in gmsh, add a few faces in one of the corners and then use those to define a volume.
If you need more help, I will try. But firstI suggest that you split your problem up into several minimum examples, each containing only one of the problems that you are working on, i.e. one example for neumann conditions, one example for volume conditions, etc. If you then post those files here, it will be much easier for me to help.
regards