Code review comment: Unfortunately, doing so would cause an NPE in the docker environment factory. The server's address descriptor is explicitly used there in order to pass to the docker invocation.  I'll introduce a no-op or exception-throwing artifact retrieval service for now to make this explicit.

Code under review:
public static DockerJobBundleFactory create(ArtifactSource artifactSource) throws Exception {
    DockerCommand dockerCommand = DockerCommand.forExecutable("docker", Duration.ofSeconds(60));
    ServerFactory serverFactory = getServerFactory();
    IdGenerator stageIdGenerator = IdGenerators.incrementingLongs();
    ControlClientPool clientPool = MapControlClientPool.create();

    GrpcFnServer<FnApiControlClientPoolService> controlServer =
        GrpcFnServer.allocatePortAndCreateFor(
            FnApiControlClientPoolService.offeringClientsToPool(
                clientPool.getSink(), GrpcContextHeaderAccessorProvider.getHeaderAccessor()),
            serverFactory);
    GrpcFnServer<GrpcLoggingService> loggingServer =
        GrpcFnServer.allocatePortAndCreateFor(
            GrpcLoggingService.forWriter(Slf4jLogWriter.getDefault()), serverFactory);
    
    GrpcFnServer<ArtifactRetrievalService> retrievalServer =
        GrpcFnServer.allocatePortAndCreateFor(null, serverFactory);
    GrpcFnServer<StaticGrpcProvisionService> provisioningServer =
        GrpcFnServer.allocatePortAndCreateFor(
            StaticGrpcProvisionService.create(ProvisionInfo.newBuilder().build()), serverFactory);
    DockerEnvironmentFactory environmentFactory =
        DockerEnvironmentFactory.forServices(
            dockerCommand,
            controlServer,
            loggingServer,
            retrievalServer,
            provisioningServer,
            clientPool.getSource(),
            IdGenerators.incrementingLongs());
    return new DockerJobBundleFactory(
        environmentFactory,
        serverFactory,
        stageIdGenerator,
        controlServer,
        loggingServer,
        retrievalServer,
        provisioningServer);
  }


Revised code:
public static DockerJobBundleFactory create(ArtifactSource artifactSource) throws Exception {
    ServerFactory serverFactory = getServerFactory();
    IdGenerator stageIdGenerator = IdGenerators.incrementingLongs();
    ControlClientPool clientPool = MapControlClientPool.create();

    GrpcFnServer<FnApiControlClientPoolService> controlServer =
        GrpcFnServer.allocatePortAndCreateFor(
            FnApiControlClientPoolService.offeringClientsToPool(
                clientPool.getSink(), GrpcContextHeaderAccessorProvider.getHeaderAccessor()),
            serverFactory);
    GrpcFnServer<GrpcLoggingService> loggingServer =
        GrpcFnServer.allocatePortAndCreateFor(
            GrpcLoggingService.forWriter(Slf4jLogWriter.getDefault()), serverFactory);
    
    GrpcFnServer<ArtifactRetrievalService> retrievalServer =
        GrpcFnServer.allocatePortAndCreateFor(
            new UnimplementedArtifactRetrievalService(), serverFactory);
    GrpcFnServer<StaticGrpcProvisionService> provisioningServer =
        GrpcFnServer.allocatePortAndCreateFor(
            StaticGrpcProvisionService.create(ProvisionInfo.newBuilder().build()), serverFactory);
    DockerEnvironmentFactory environmentFactory =
        DockerEnvironmentFactory.forServices(
            controlServer,
            loggingServer,
            retrievalServer,
            provisioningServer,
            clientPool.getSource(),
            IdGenerators.incrementingLongs());
    return new DockerJobBundleFactory(
        environmentFactory,
        serverFactory,
        stageIdGenerator,
        controlServer,
        loggingServer,
        retrievalServer,
        provisioningServer);
  }