How can I take a folder as an input in my go api and know the relative path
or absolute path of each file in each folder

On Fri, Feb 8, 2019 at 7:12 AM David Riley <fraveyd...@gmail.com> wrote:

> Yes, but we have somewhat different objectives than you might.
>
> We use the Docker golang (alpine) image to build our images, and it works
> wonderfully (and really makes it a lot easier to cope with differences in
> Jenkins build nodes).  However, our apps generally eventually run on
> Kubernetes, which means we have a few things to consider for actual use
> that other folks might not.
>
> I should also note that for the most part, we use shell scripts to build,
> as make doesn't really bring us many advantages; it can't really track
> dependencies across the Docker barrier, and since they're not strictly
> speaking files, it can't track the predecessor images (we use a multi-stage
> build process) as dependencies, so shell scripts it is.
>
> By way of background, our project is a collection of microservices which
> we generally build at the same time for a variety of reasons (one of which
> is to maximize parallelism and cache reuse).  We use `go build` and/or `go
> install` to achieve that, but we use `go run` when testing things.
>
> Our build process is as follows:
>
> - We make a "build" image for each supported distribution we build our
> apps for (currently Alpine and CentOS, which have to be built separately
> because Alpine's musl-libc makes the binaries incompatible with everything
> else).  The build image is generally the base Go image (which is the
> official one for Alpine, and an equivalent cobbled-together one for CentOS)
> along with a basic set of packages installed that we know we need for our
> build (typically git, gcc, protobuf stuff and not much more).  That image
> is stored locally and used as a base for the next step.
>
> - We make a "base" image by first copying in the bootstrap scripts
> (formerly to install dep, but now just to do a bit of prep work) and the
> go.{mod,sum} files.  We warm up the build cache by running `go mod
> download`, then copy in some secondary scripts to run `go get -u` to pull
> in the required Go binaries for things like code generators needed for the
> build.  Then we copy in the rest of the code (we defer this to maximize use
> of the Docker build cache so it doesn't fetch the dependencies every time),
> run the code generators with `go generate`, and then run `go install` on
> all the apps we want to build (rather than `go build` so they wind up in an
> easily-known location), running it on all of them at once to build them at
> the same time.  After that, we copy a few of the static assets that get
> bundled with the apps over to other well-known locations in the image
> because none of our environment variables carry over to the next step.
>
> - We then use Docker's newer multi-stage build capability to start from a
> fresh runtime image for each app/distro combo, and copy the apps and their
> required static assets into the fresh image. That way, our Alpine images
> tend to be less than 15MB each (CentOS is a bit more, though in theory the
> base layers get reused, though this is not always true for distribution).
> Because they are microservices, each app container is built with the
> entrypoint simply launching the app itself so the container terminates when
> the app does (which is preferable for Kubernetes).
>
>
> Now, this obviously wouldn't be ideal for rapid deployment, which is where
> things start getting interesting.  In theory, we could work directly from
> the "base" container (the middle piece), since that has all the source and
> runtime needed to run the containers, but not everyone on the team relishes
> using terminal-based text editors (there's no accounting for taste).  We
> do, in fact, run the unit tests and benchmarks from that container and it
> works splendidly.  But for an edit-compile-run cycle, it leaves a little
> bit to be desired, so we add a bit more on for local development.
>
> For the iterative cycle, we do two things.  First, we bind-mount our
> source directory over the copied source directory in the container (yeah,
> it's a little wasteful, but the image is already there and set up, so).  We
> then run an autorunner which watches the source files and re-runs `go run
> ./<appdir>/<app.go> <args>` (we use `reflex` since it worked best for our
> purposes, but there are others out there including `realize` which seems to
> be generally more popular).  This works wonders for developing
> microservices in the container environment with an editor outside the
> container, though getting the regexes to hit all the right files can be
> interesting; you may need to manually poke things after a `go generate`,
> for example.  This works extremely well even across the VM barrier of
> Docker for Mac, and I would assume also Docker for Windows, since they have
> taken great pains to ensure that filesystem notifications work across
> platforms.
>
> For specific Kubernetes work, because we want to be able to connect to
> in-cluster resources that aren't available outside the cluster as well as
> connect to the API and get all the environment variables we'd get when
> deployed in-cluster, it's a bit more complex.  You don't want to be trying
> to negotiate bind-mounted volumes in a k8s cluster deployed by a Helm
> chart; it's just not worth the trouble (and just isn't possible if your
> cluster is remote).  For this, we use Telepresence, which does a pretty
> great job of proxying a local container into the remote or local cluster in
> place of another deployment; as far as your container and the cluster are
> concerned, you might as well be running right inside.  We use the
> container-proxying method Telepresence offers; the VPN option won't work
> with AnyConnect (which we need) and proxies the entire machine into the
> cluster anyway, and the libc shim functions don't work on Go because, well,
> libc.
>
> Coupled with the autorunner, this has massively improved our development
> experience.  Before we had to move in-cluster (because we could use just
> the external interfaces), we could just `go run` things locally with
> environment variables set, but once we moved in cluster it became a
> laborious cycle of edit code->build container->kubectl edit/delete
> pod->kubectl logs, which took about 3 minutes per cycle worst case.  Now it
> just rebuilds when we edit the source files, and the cycle time is
> something like 10s max.
>
> Anyway, I hope that helps. I'm happy to help with more specific queries,
> but that's a containerized setup that's worked quite well for us so far.
>
>
> - Dave
>
>
> > On Feb 2, 2019, at 12:02 PM, Keith Brown <keith6...@gmail.com> wrote:
> >
> > Thanks.
> >
> > At the moment I use a Makefile (different from the above :-) ) .
> >
> > I suppose I am asking because I want to integrate vim-go with the docker
> build ( docker run -v $PWD:/mnt -w /mnt bash -c "go build main.go" )
> > Was wondering if anyone has done that before.
> >
> >
> > On Friday, February 1, 2019 at 7:30:32 PM UTC-5, Space A. wrote:
> > You simply need
> > docker run <...>
> > which will invoke smth like
> > go build
> > at the end.
> >
> > PS: The above Makefile is garbage.
> >
> >
> > пятница, 1 февраля 2019 г., 21:59:53 UTC+3 пользователь Bojan Delić
> написал:
> > I have Makefile that supports build in docker image, part of it looks
> something like this:
> >
> > NAME := <name>
> > PACKAGE := github.com/username/repo
> >
> >
> > .PHONY: build
> > build: clean gobuild ## Build application
> >
> > .PHONY: gobuild
> > gobuild: LDFLAGS=$(shell ./scripts/gen-ldflags.sh $(VERSION))
> > gobuild:
> >    @echo "Building '$(NAME)'"
> >    @env go generate -mod=vendor
> >    @CGO_ENABLED=0 go build -mod=vendor --ldflags "$(LDFLAGS)" -tags
> netgo .
> >
> > .PHONY: clean
> > clean: ## Remove build artifacts
> >    @echo "==> Cleaning build artifacts..."
> >    @rm -fv coverage.txt
> >    @find . -name '*.test' | xargs rm -fv
> >    @rm -fv $(NAME)
> >
> > .PHONY: build-in-docker
> > build-in-docker:
> >    @docker run --rm \
> >       -v $(shell pwd):/go/src/$(PACKAGE) \
> >       -w /go/src/$(PACKAGE) \
> >       -e GO111MODULE=on \
> >       golang:latest \
> >       make build
> >
> > As you can see, there are some external scripts called (like
> gen-ldflags.sh) and docker build is just invoking "make build" inside
> docker container. I do not use this for CI (GitLab CI is already setup to
> use docker images), so that is why I use latest tag (in CI I use explicit
> version of Go).
> >
> >
> > There are some leftovers from earlier times, like mounting working dir
> to GOPATH, which is not needed if GO111MODULE is set.
> >
> >
> > On Friday, February 1, 2019 at 4:48:01 AM UTC+1, Keith Brown wrote:
> > does anyone use docker golang image to compile? if so,how is your setup?
> >
> >
> > --
> > You received this message because you are subscribed to the Google
> Groups "golang-nuts" group.
> > To unsubscribe from this group and stop receiving emails from it, send
> an email to golang-nuts+unsubscr...@googlegroups.com.
> > For more options, visit https://groups.google.com/d/optout.
>
> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to golang-nuts+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to