On 03/15/2018 08:42 PM, Ian Campbell wrote:
On Thu, 2018-03-15 at 12:52 +0000, Martín Ferrari wrote:
I sometimes have kept small dependencies vendored in for
convenience..
But keeping the whole containerd seems wrong to me.
OTOH it _might_ not be totally unreasonable to apply that tactic to
swarmkit which in essence has a single consumer (docker engine).

That's a good point. Here's the dependency tree that bothers me right now

docker-engine
 \_ golang-github-docker-swarmkit
     \_ golang-github-docker-libnetwork

The main problem here are the circular dependencies, since both swarmkit and libnetwork import bits from docker-engine. To avoid the circular dep, I vendor docker-engine within swarmkit and libnetwork. But it doesn't work, because I end up with duplicated bits that are not compatible, as described in <https://github.com/Masterminds/glide/issues/73>.

To be more specific, both import 'pkg/plugingetter', and the build fails with this error:

have Get(string, string, int) ("github.com/docker/swarmkit/vendor/github.com/docker/docker/pkg/plugingetter".CompatPlugin, error) want Get(string, string, int) ("github.com/docker/libnetwork/vendor/github.com/docker/docker/pkg/plugingetter".CompatPlugin, error)

Actually, this 'pkg' directory is the main cause of circular dependencies, and hence it's a big pain point. From the README that you can find in moby/pkg:

"pkg/ is a collection of utility packages used by the Docker project without being specific to its internals."

These utilities are useful outside of docker, and that's why every other docker projects include docker-engine and fish into the pkg directory. Hence the circular dependencies.

If we could somehow package this directory as a library, separately from docker, then we would have much less  circular dependencies. But since this directory is definitely not something stable, that will also bring us deeper in an "unresolvable dependencies hell".

So how to solve that ?

One easy solution would be to stop packaging swarmkit and libnetwork, and just vendor it in docker-engine. Of course, that makes sense only if there's no other consumers for these libraries.

The other solution (for me) is to learn more about Go and the way they handle this problem of duplicated vendored bits, and then transpose this solution somewhere in the debian packaging files.

It's also possible that I just do it something wrong somewhere, and I didn't figure it out yet.

In an ideal world, we should try to convince the docker people to use
stable APIs (that means using only released non-alpha versions!),
FWIW the engine uses a non-alpha version in recent releases. It seems
to be swarmkit (another dep of engine) which is lagging and using the
alpha version (kind of interesting that that code seems to be ok when
vendored into moby but apparantly not when standalone, I suppose they
use different subsets of the API in different ways).

Very interesting point indeed. For more details, here are the versions of containerd vendored by docker:

- docker-engine (ie moby): 3fa104f (after v1.0.0)
- docker-swarmkit: 29a4dd7 (somewhere between v1.0.0 alpha3 and alpha4)

Having both in sync would help for sure.

However after giving it a closer look, I think I could patch swarmkit to build against containerd v1.0.0. Maybe it's not so hard.

I think now that containerd v1.0.0 is out and given the stated API
guarentees containerd is making[0] the problem will be less bad in the
future at least wrt this particular set of components since there
ougtn't to be build breakage from using a "too new" version of
container within a given major release series.

I hope you're right :)

Regards,

  Arnaud

_______________________________________________
Pkg-go-maintainers mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-go-maintainers

Reply via email to