D for microservices: ldc, rdmd, dub now available on Alpine x86_64

Mathias Lang pro.mathias.lang at gmail.com
Tue Nov 5 02:16:28 UTC 2019


Hi all,
Recently there have been inquiries about support for D on Alpine 
Linux, a distribution mostly used in combination with Docker to 
create lightweight container images for microservices.

At BPF Korea, we're working on a blockchain written in D, and 
wanted to be able to easily test and distribute our node using 
Alpine images, but there was no package for it yet.

However, thanks to the work of many contributors before (Joakim 
Noah, yshui, Petar Kirov/zombinedev, and many others), most of 
the porting was already done and it was just a matter of fixing a 
few small issues and and creating the package definitions.

A package for `dub` (v1.18.0), `dtools` (ddemangle & rdmd), and 
`ldc` (v1.18.0) are now available in the `testing` repository of 
Alpine Linux edge. As `testing` is not enabled by default, you 
will need to specify the repository (or add it to your 
`/etc/apk/repositories`) when installing the packages.
For example:
```
apk --no-cache add -X 
http://dl-cdn.alpinelinux.org/alpine/edge/testing ldc ldc-static 
dtools-rdmd dub
```
This command needs to originate from an `alpine:edge` image as it 
links with a recent libc and LLVM.
If you just want the compiler, you still need to provide `ldc` & 
`ldc-static` for things to work out of the box.

More complete example of how we use it to build a D program, 
using multi-stage builds:
```
# Build from source
FROM alpine:edge AS Builder
ARG DUB_OPTIONS
RUN apk --no-cache add build-base git <other dependencies>
RUN apk --no-cache add -X 
http://dl-cdn.alpinelinux.org/alpine/edge/testing ldc ldc-static 
dtools-rdmd dub
ADD . /root/myproject/
WORKDIR /root/myproject/
# Note: This will redownload your dependencies every time, which 
doesn't play well with docker
# We use submodules for dependencies, hence we have 
`--skip-registry=all`
RUN dub build --compiler=ldc2 ${DUB_OPTIONS}

# Runner
FROM alpine:edge
COPY --from=Builder /root/project/executable /usr/bin/executable
RUN apk --no-cache add libexecinfo <runtime dependencies>
WORKDIR /root/
ENTRYPOINT [ "/usr/bin/executable" ]
```
`DUB_OPTIONS` can be used to select a build, for example enabling 
coverage in a CI pipeline.

What's next ?
1) There is a pending PR 
(https://github.com/alpinelinux/aports/pull/12006) to have GDC 
working on all architectures alpine supports, not just x86_64.
2) Adding a package for gdmd
3) Rebuild packages based on GDC, so that all architectures are 
supported.
4) Move the packages to community so they are available out of 
the box. It would be great for it to happen by the end of the 
month, as the next alpine release would be around end of December 
according to their schedule, but that depends on how long PR take 
to be reviewed.
5) A DMD package for x86 and x86_64 shouldn't be hard to make 
either


More information about the Digitalmars-d-announce mailing list