►
From YouTube: TGI Kubernetes 161: Let's Build a Buildpack
Description
Notes: https://tgik.io/notes
Come hang out with Evan Anderson as he explores Cloud Native Buildpacks! We'll probably be taking a look at what it takes to add some Python code to an existing buildpack, and then trying to run both local and on-cluster builds using the same (repeatable) tools.
A
Hello,
everyone
welcome
to
tgik
and
it
looks
like
people
are
starting
to
come
in
so
I'll
be
getting
started
shortly.
This
week's
topic
is
cloud
native,
build
packs
for
those
of
you
who
aren't
familiar
with
them.
We
will
be
learning
a
little
bit
about
how
they
work
and
then
I'll
be
actually
trying
to
build
one
live
on
screen.
I
guess
not
really
on
stage,
and
I've
never
done
this
before
so
we'll
see
how
it
goes.
B
A
A
Aren't
familiar,
we
usually
start
with
news
of
the
week
and
if
you
want
to
log
in
to,
if
you
want
to
look
log
into
hackmd.
A
And
then
then
we.
A
Some
more
stuff
in
I
kind
of
I
kind
of
had
a
launch
this
week
and
everything
else
sort
of
went
out
of
my
brain
for
a
while.
So
I
will
admit
I
haven't
followed.
B
A
I
see
a
couple
of
my
teammates
there,
hello,
yousef
and
tim
yeah
and
if
you're
coming
here,
because
you
heard
that
I'll
be
doing
crazy
things
with
windows,
they
aren't
too
crazy,
but
yeah.
E
A
A
Me
and
I'm
I
will
try
my
best
hey.
B
A
A
The
news
of
the
week
I'm
going
to
switch
this
to
the
prettier
view.
The.
A
Release
is
approaching
release
which
means
that
if
you're.
A
So
I
called
out
two
in
particular
that
were
introduced
in
119,
but
if
you
want
the
full
list
in
this
blog
post,
you
can
see
that
there's
web
hook
configurations
and
crds
and
api
registration.
So
this
is,
if
you're
doing
your
own
custom
api
server
token
review
for
authentication
the
beta
version.
Again.
These.
A
I
had
a
cluster
that
I
got
to
learn
a
lot
more
about
a
td
than
I
wanted
to
when
I
didn't
upgrade.
That
was
that
had
cut
out
a
particular
api
version
and
I
didn't
realize
I
was
using
it
so
certificate
signing
requests,
leases
and
ingress
is
the
other
big
one,
both
extensions
v1,
beta,
1
and
networking
case
side.
I
have
v1
beta1,
so.
A
So
yeah,
you
should
be
able
to
use
that
link
to
add
notes,
or
you
can
add
them
in
chat
and
I'll
copy
them
over
here.
Two
things
I
am
aware
of:
there's
a
contour
security
release
and
the
bug
here
is
actually
kind
of
interesting.
You
can
create
an
http
proxy
that
points
to
an
external
name
service
which
is
usually
used
to
say,
here's
something
off
cluster,
but
you,
oh,
that
sounds
pretty
exciting.
A
I
want
to
see
this
helm
one
too,
so
you
can
create
an
http
proxy
contour
is
a
ingress
implementation
point
it
at
a
service,
that's
an
external
name
and
then
say
the
external
name
you're
interested
in
is
localhost,
and
then
you
can
actually
go
and
you've
exposed
envoys
admit
interfaces
to
the
universe,
which
is
kind
of
not
what
you
meant
to
do,
and
so
17.1
and
18
are
going
to
have
a
fix
for
that.
A
A
little
thing
I
worked
on
cloud
native
runtimes
for
tanzu
is
generally
available.
This
is
vmware's
distribution
of
k-native,
and
I
helped
with
this.
So
I'm
going
to
put
it
in
there,
even
though
it's
sort.
B
A
Username
and
password
credentials
associate
one
helm
repository
would
be
passed
on.
Oh,
it
looks
like
if
you
have
credentials
for
one
helm
repository
and
you
reference
a
helm
chart
another
repository.
It
will
pass
your
credentials
over
to
that.
Second
repository.
Oh,
thank
you!
A
Yes,
okay,
I
did
think
I
was
sharing
my
screen.
I'm
gonna
go
back
and
I'm
gonna
do
this
real,
quick,
but
I'm
gonna.
Let
people
see
this
stuff
so.
A
I'm
gonna
put
that
in
again
in
case
anyone
has
another
thing
to
add.
So
it
looks
like
there's
two
embarrassing
security
boo-boos
this
week,
but
also
here's
the
blog
post.
A
I
don't
know
in
august
when
the
or
you
want
to
try
the
rc0
check
your
controllers
and
then
here's
the
contour.
A
If
you,
if
you
have
a
reference
to
another
chart,
so
you
have
a
chart,
that's
including
another
chart.
You
can
share
your
password
and
your
username
and
password
by
accident.
Oh
and
there's
a
wisem.
A
D
A
Let's
see
so
this.
C
A
A
A
So
cloud
native,
build
packs
is
basically
a
standard
way
of
transforming
your
applications
from
source
code
to
a
container
in
a
way,
that's
repeatable
and
consistent,
and
so
there's
a
pax
cli.
So
we'll
probably
get
started
with
that.
But
it
has
a
long
lineage.
A
You
can
see
originally
build
packs
were
invented
by
heroku
and
then
pivotal
sort
of
cloned
the
concept
and
built
a
v2
and
heroku
also
built
v2,
and
they
were
actually
incompatible
with
each
other
and
so
cloud
native,
build
taxes,
attempt
to
unify
the
process
and
make
it
consistent
and
open
source,
and
a
lot
of
that
is
by
having
a
contract
that
describes
how
you
actually
can
use
these
to
build
or
rebuild
containers.
A
A
Let's
see,
I've
got
docker
and
pack
installed
already.
Actually
so
we're
going
to
go
through
this
a
little
bit.
Oh,
this
is
actually
a
really
important
note,
even
though
it's
in
extra
small
type,
let
me
blow
things
up
a
little
bit.
A
So
pac
is
a
local
implementation
that
uses
docker
in
order
to
build
cloud
native
in
order
to
build
containers.
But
there
are
other
implementations
of
cloud
native,
build
packs
and
because
there's
a
standard
way
that
all
of
these
present
themselves,
you
actually
can.
A
You
can
actually
move
these
around
between
different
providers,
so
there
are
do
they
have
a
list.
A
In
the
docs
yeah,
so
there's
a
bunch
of
different
tools
that
all
implement
these
build
pack
commands
so
circle
ci
and
get
lab
use
pack.
There's
a
tool
called
kpac
that
lets
you.
That
gives
you
a
kubernetes
version
of
the
pack
command
that
will
automatically
rebuild
when
your
source
or
your
base
images
change.
We're
going
to
probably
be
mostly
using
pac
today
and
then
techton.
Also,
if
you're
using
tekton
for
build,
has
a
way
to
use,
build
packs
automatically.
A
A
A
And
so
let's
start
the
tutorial
so
yeah.
B
A
A
build
pack
is
basically
a
standard
way
to
actually
gather
up
all
the
things
your
app
needs,
so
you
can
think
of
it
a
little
bit
like
a
little
bit
like
a
standard
form.
A
And
one
of
the
neat
things
that
they
support
is
this
auto
detection,
so
you
can
actually
put
together
a
build
pack
that
will
figure
out.
Oh,
this
is
a
javascript
project,
or
this
is
a
java
project
and
you
don't
have
to
you.
Don't
you
don't
have
to
know
in
your
build
system
like
we're
on
a
different
command
for
this
or
that
you
just
say,
run
this
build
pack
and
it
will
figure
out
which
sub
builders
it
needs
to
execute,
and
so
one.
E
A
Things
that
throws
me
for
a
loop
here
and
I'm
probably
going
to
get
it
wrong
at
least
once
I've
talked
with
some
people,
but
never
actually
built.
One
of
these
is
the
difference
between
a
builder,
a
build
pack,
and
I'm
not
sure
if
there's
another
component
in
here
or
not,
but
there's
a
couple,
things
named
build
something,
and
I
tend
to
mix
them
up
so
builder
is
actually
the
image.
A
I'm
not
quite
sure
I
see
carlos
asked
a
question
about.
Is
it
a
way
you
use
a
different
stack
like
alpine,
I'm
not
sure
what
that's
about
and
then
is
there
a
tool
which
supports
deployment
of
operators
again,
you
might
need
to
ask
that
question
a
slightly
different
way,
we're
focusing
on
creating
containers
today
from
source
code,
so
we
might
not
get
to
anything
using
a
kubernetes
operator
today.
A
E
E
D
B
D
A
Examples
for
java
kotlin,
ruby,
a
bash
script
and
some
other
stuff.
What's
in
batch.
D
B
B
A
A
E
B
A
We
can
see
that
right
now
it's
pulling
the
image.
So
that's
going
to
take
a
little
while,
apparently,
hopefully,.
A
C
B
B
A
A
A
Going
to
go
and
fetch
all
the
different
components
needed
to
do
a
build
with
java
in
docker
images
and
run,
and
I
don't
need
to
have
docker
installed
on
my
local
or
have
java
installed
on
my
machine
to
do
a
maven
build
or
have
maven
installed
and
this
process,
because
it's
building
in
docker
containers
is
actually
going
to
work.
The
same
if
you're,
on
a
mac
or
on
windows.
A
A
A
This
this
is
java,
if
you
notice
here,
our
builder
was
called
sample
builder
bionic.
So
I'm
pretty
sure
that
these
samples
are
using
a
builder
that
supports
multiple.
B
A
Thing
here
is:
if
you
look
at
this
project,
there's
actually
nothing
that
specifically
clues
you
in
that
it's
using
build
packs
at
all.
It
just
looks
like
a
standard
maven
project
and
let's
see
what
the
application
is
going
to
be
looks
like
it
just
runs.
The
application
doesn't
even
print
anything
out.
C
A
This
is
one
of
the
other
neat
things
about
cloud-native,
build
packs,
you'll
notice,
they're.
Actually,
since
we
talked
about
using
docker
images
here
or
builder
images,
they
have
different
builder
images
for
using
either
bionic
or
alpine,
and
you
can
swap
between
the.
C
B
A
A
A
C
A
C
B
A
C
So,
apparently,
out
all
the
java
images,
my
computer
decided
to
go
as
fast
as
possible
and
de-prioritize
silly
things
like.
B
Video
to
youtube
so
at
this
point
you
can.
C
B
A
Installed
on
my
machine
at
all,
I've
just
built
a
java
application.
C
Actually,
have
you
know
the
the
java
compiler
and
so
forth
in
them
and
the
jre.
B
And
so
forth,
and
so
my
computer.
B
A
D
E
A
So
it
looks
like
this
app
actually
is
starting
tomcat.
So
I
don't
know
if
I
looked
at
the
wrong
code
or
what
but.
A
This
is
the
java
maven
app
and
sample
application.
Oh
it's
a
spring
boot
application.
I
totally
missed
the
annotation,
so
yeah
it's
doing
its
spring
boot
thing
and
it's
probably
serving
index.html
on
port
8080.
A
No,
I
I
think
this
was
totally
self-inflicted.
I
will
remember
next
time
not
to
saturate
my
link
in
order
to,
in
order
to
fetch
these
images
just
a
little
faster.
Maybe
I
need
to
put
some
qos
in
there
so
now,
let's
see.
E
E
E
E
E
E
A
D
E
A
So
that's
the
simple
value
proposition
for
cloud
native
build
packs.
Is
you
can
have
a
you?
Can
just
fetch
down
a
directory?
You
don't
need
to
worry
about
what
tools
you
need
to
install
as
long
as
you've
got
a
way
to
either
do
the
pack
command.
A
Like
we
did
up
here
and
you
just
reference
a
builder
that
will
get
pulled
down
and
if
you're,
using
something
like
techton
or
kpac,
you'll
actually
be
able
to
have
the
you
know,
have
that
run
in
the
cloud
and
not
even
fetch
everything
down
locally
to
your
machine,
and
so
that
won't
overwhelm
things.
A
This
suggests:
let's
try
building
this
a
second
time
so
before
we
do
that.
E
Let's
start
vs
code
here.
No,
I
don't
need
to
trust
the
authors
of
this
resources.
E
A
So
we'll
save
that-
and
maybe
also
we'll
just
put
in
here.
A
Before
we
start
the
application,
oh
and
one
thing-
I
don't
know,
if
you
noticed,
I
don't
have
the
java
extensions
installed
even
here,
so
I'm
really
doing
this
on
a
machine
without
java,
but
we
can
just
do
a
pack
build
and
the
second
time
we
shouldn't
hit
all
of
the
video
problems,
because
all
of
the
containers
are
cached
and
look
at
that.
This
is
the
time
for
building
the
second
copy
of
my
app
and
then
I'm
actually
going
to
go
over
here
to
do
a
docker.
D
Run
I
think
that
worked.
A
Okay,
so
yeah
we've
started
that
app
and
I.
A
Docker
exposes
and
still
isn't
connecting
the
way
I
wanted.
A
Okay,
oh
it's
dash
p.
A
B
C
E
A
Thank
you
yousef
you,
you
knew
what
I
actually
should
do.
I
keep
trying
to
make
it
a
little
bit
faster
and
that
doesn't.
A
A
Again,
you
may
have
pac
installed
locally,
but
for
some
of
these
other
tools
you
may
not-
and
so
it's
nice-
that
they
will
just
go
directly
out
into
the
cloud
and
you
can
skip
the
local
registry
step
if
you're
running
on
kubernetes,
for
example,
it
may
not
make
any
sense
to
build
things
onto
the
local
cubelets
docker
registry.
A
So,
let's
see
so
we've
done
that
and
now
build
pack
authors
guide.
So
let's
create
a
build
pack.
We've
got
docker
and
pack
installed.
A
A
I
know
that
it
feels
like
it
should
be
really
easy
to
get
a
theme
for
documentation
for
open
source.
It
turns
out
it's
really
hard,
so
I'm
not
going
to
give
them
a
hard
time
about
this
huge
menu
at
the
top,
because
on
the
candidate
project,
we've
been
fighting
the
same
thing
and
it
was
hard
so
so
they're
going
to
walk
us
through
a
ruby
example,
but
I
want
to
do
python,
so
I
that's
wsl.
We
may
not
need
window
subsystem
at
all.
D
D
A
E
A
Make
sure
docker
is
running
okay,
I
don't
know
if
I'm
going
to
deploy
this
to
kubernetes
today
or
not.
I
think
if
I
can
get
it
running
locally,
actually
deploying
it
to
kubernetes
shouldn't
be
that
hard.
A
If
this
all
goes
well
in
the
next
40-ish
minutes,
or
so,
I
may
actually
end
up
building
a
function,
build
pack
for
k-native
that
will
transform
a
function
like
this.
That
takes
an
http
request
into
a
into
a
full-blown
canadian
application,
but
I
might
not
get
to
that.
So
I'm
not
gonna
fight,
I'm
not
going
to
rush
things
and
skip
over
the
learning
so
that
the
build
pack
scaffolding
create
a
directory
where
your
build
pack
will
live.
D
E
A
I
actually
like
that.
Vs
code
now
asks
me
before
it
runs
all
the
commands
that
might
be
in
a
repo
that
I've
just
checked
out.
So
here's
our
buildpack.toml.
A
The
stack
id
is
the
root
file
system
in
which
the
root
in
which
the
build
pack
will
be
run.
We
need
to
create,
detect
and
build
scripts.
D
A
Okay,
so
this
looks
like
it's
a
bash
script
right
now,
but
I'm
guessing
bash
isn't
our
only
option
here,
I'm
guessing
anything!
We've
got
installed.
So
I'm
wondering.
A
E
D
A
A
A
Okay,
let's
try
this
again
and
it's
kind
of
funny
I
copy
the
command
over
and
so
I'm
building
an
image
called
testrubyapp.
That's
python!.
A
So
that's
just
gonna
run
again
replace
exit
one.
B
E
A
So
one
thing
I'm
wondering
is,
if
I
want
to
run
python,
is
actually
installed.
A
C
A
Oh,
this
is
nice,
the
user
id
that
you're
supposed
to
run
as
is
not
root,
so
that
helps
make
sure
that
you're
doing
more
secure
builds
off.
You
know
right
out
of
the
bat.
The
default
for
docker
images
to
run
is
root,
so.
E
A
Install
and
this
is
just
going
to
clean
up
the
content
from
that
get
updating
the
same
command
so
that
your
docker
images
are
smaller.
D
D
D
A
E
A
Hopefully,
this
will
not
be
quite
as
intensive
as
fetching
java.
We
also
need
to
create
a
run
image.
D
A
A
A
A
We
are
building
a
stack
targeting
build
as
the
base
here
and.
B
D
A
To
do
any
of
this,
so
you
can
see
over
here
in
this
example
you're
installing
git
and
wget
and
jq,
and
then
this
yj
tool
as
well
you're,
just
copying
it
into
user
bin
user,
local
bin
yj,
and
so
your
build
would
have
access
to
get
and
w
get
and
jq
and
yj.
A
A
A
And
this
shouldn't
take
too
long.
It
is
going
to
run
apt
to
get
update,
but
then,
once
it's
fetched
everything,
it's
just
going
to
clear
it
out
and
be
done,
but
that
lets
me
later
on
go
in
and
add,
install
and
stuff.
E
C
B
C
C
D
A
Dive
is
a
tool
for
investigating
the
metadata
of
cloud
native,
build
packs
or
sorry
oci
images.
So
this
lets
us
see
some
of
the
layer
details
and
what
all
the
files
are
in
the
image
and
what
commands
are
used
to
build
it
and
yeah.
It's
pretty
it's
pretty
handy.
A
So,
for
example,
we
can
see
here
all
the
added
files
from
when
we
did
at
get
update
and
apt
get
install
python
so
might
be
surprised
to
see
that
like
lzcat
was
added
as
a
as
a
link
and
let's
see
what
else
so
shouldn't
be
too
surprised.
Oh,
it
looks
like
we
might
have
gotten
python
two
seven.
A
Well,
one
of
the
things
I'm
discovering
is
that
I've
actually
built
a
python
2
image
rather
than
a
python
3
image,
which
is
gonna,
be
a
problem,
but
the
other
thing
that
we
can
do
if
we
are
trying
to
figure
out
what's
going
on
here.
A
D
A
Yeah,
I
probably
would
want
to
install
python
3
pip,
so
now
I'm
discovering
why
it
is
that
a
lot
of
these
are
shell,
build
packs
or
are
using
shell
here.
Is
that
otherwise
you
have
to
build
your
own
stack,
but
I'm
not
deterred.
I'm
going
to
try
to
build
my
own
stack.
I'm
also
going
to
try
installing
python
3,
because.
B
A
E
C
B
A
Green
manifest
get
the
manifest
of
an
image,
so
the
manifest
is
going
to
be
all
the
header
information
from.
What's
going
to
be
all
the
header
information
from
the
oci
image.
So
I
should
be
able
to
do
this
and.
D
A
A
A
Okay,
so
here's
our
image,
the
builder
image,
is
an
amd64.
It
looks
like
the
created.
Timestamp
is
all
emptied
out.
It's
linux
here
are
the
different
layers.
It
runs
bash.
Here's
the
environment
and
here
are
the
labels
that
it
has
that
we
were
seeing
complaints
about
earlier
when
we
tried
to
do
that
build
it
was
saying
validating
that
this
builder
exists.
A
Builder
is
missing
this
metadata,
so
it
looks
like
we
probably
would
want
to
go
back
and
update.
E
A
All
this
stuff
was
in
there
a
while
ago,
so
it's
not
clear
why
these
directions
don't
mention
it,
but
it
looks
like
we
would
need
to
set
some
extra
labels
here.
E
E
D
D
C
D
E
We're
looking
at
json
versus
the
docker
image
and,
let's
see.
B
D
Oh
docker
belt,
I
know
an
instruction.
E
E
D
E
Use
the
stack
c
sample
builders
here
we
go
okay,.
E
A
D
E
C
A
And
then
a
stack,
but
I'm
building
this
I'm
I've
built
this
stack
so
that
I
can
build
my
build
pack
and
it
looks
like
I
maybe
I'm
going
to
have
to
iterate
a
couple
times
to
get
a
builder
that
works
with
my
stack.
A
Oh,
I
was
just
looking
at
this
and
it
looks
like
maybe
in
adding
pip
is
adding
a
dependency
on
the
c
plus
compiler
and
a
bunch
of
other
stuff,
so
yeah.
One
of
the
reasons
that
build
packs
are
nice.
Is
you
you
do
basically
the
two-stage
docker
build
where
you
have
one
build
that
has
all
of
your
containers
or
sorry
that
has
like
your
source
code
and
your
compiler
and
so
forth,
and
then
you
specifically
take
the
artifacts.
A
You
want
in
your
run
environment
and
you
move
them
over
from
the
build
environment
to
the
run
environment,
and
then
you
throw
away
the
build
environment.
So
you
end
up
with
a
final
image
that
doesn't
have,
for
example,
a
c
compiler
in
it
or
doesn't
have
you
know
other
libraries
and
things
like
that?
A
So
that's
that's
nice
for
security,
because
stuff
that
you
haven't
built
into
your
image
is
stuff
that
you
don't
have
to
worry
about
vulnerabilities
for
it's
also
nice
for
a
for
a
system
like
k,
native
where
you
may
be
starting
containers.
Frequently
having
smaller
containers
means
that
your
containers
will
start
up
faster
and
aren't
going
to
have.
A
You
know
aren't
going
to
end
up
fetching
down
a
whole
bunch
of
stuff.
If
you're
using
the
default,
docker
or
cryo
or
container
d
run
times,
they
will
fetch
down
your
entire
image
and
then
unpack
it
onto
disk
before
you
can
start
your
container.
A
So
if
you
have
a
big
container,
even
if
you
don't
use
90
of
it,
it
all
has
to
come
down
onto
disk.
It
all
has
to
get
unzipped.
It
all
has
to
get
put
back
down
onto
disk
and
so
being
able
instead
to
say:
oh,
it's
80
megabytes
or
something
like
that
is
pretty
useful
and
let's
just
get
a
sense
of
how
big.
A
Let's
see
we're
gonna,
try
dive
again
on
test
python
and
we
can
see
the
base.
Image
is
63
megabytes
when
we
added
python.
Why
does
this
not
say
python
3?
Oh
because
I
renamed
the
image
to.
A
A
A
If
you
did
this
in
a
second
command
after
the
first
one,
you'd
actually
create
a
layer
that
had
all
you
of
your
apt-get
update
contents
and
then
another
layer
that
takes
them
away,
but
you
have
to
download
both
layers,
so
you
don't
actually
save
any
space.
So
that's
why
you
see
these
big
docker
commands
with
a
bunch
of
commands,
strung
together
with
ampersand,
is
that
each
run
line
creates
a
new
container,
which
is
good
for
caching
sometimes,
but
is
awkward
to
read.
A
I
get
the
feeling
that
this
test
python
build
image
is
going
to
be
kind
of
big,
which,
on
one
hand,
is
sort
of
great,
because
that
means
we've
got
all
the
tools
that
we
need
and
it's
not
going
to
impair
the
final
size
of
the
binary
unless
we're
actually
pulling
that
stuff.
In
as
being.
A
A
D
D
D
A
So
it
looks
like
for
a
builder,
you
specify
the
order
that
each
build
pack
that
you
want
to
participate
in
this
system
will
run
in.
A
So
yeah,
so
we
have
these
previous
two
ones
this.
These
three
layers
together
made
up
the
base
and
then,
on
top
of
that,
we
added
this
install
python,
3
pip
and
if
we
go
over
here.
E
A
Can
cut
out
all
the
unmodified
ones
and
we
can
see
that
we
did
indeed
get
g
plus,
plus
and
gcc
pin
entry
for
some
reason.
I
don't
know.
A
We
got
pearl
somehow
so
yeah.
If
you
didn't
want
a.
If
you
didn't
want
pearl
and
a
c
plus
compiler
in
your
images,
then
it
seems
like
this
would
be
the
way
to
go,
to
have
a
separate,
build
image
so
that
you
can
leave
stuff
like
c
plus,
plus
and
pearl
out,
even
if
you
need
them
as
part
of
your
build.
D
A
D
A
D
E
D
D
E
A
Oh
pack
builder
is
putting
together
a
a
more
complex
image,
so
but
I'm
still
not
finding
python
in
my
path
here.
So
if
we
go
back
over
here
and
we
do
a
docker
run
or
let's,
let's
look
at
it
with
dive.
First.
A
We're
going
to
get
an
image
that
actually
has
the
builder
and
a
bunch
of
other
stuff
built
into
it.
So
this
is
from
that
other
layer.
A
It's
actually
wiped
out
the
command,
interestingly,
but
here's
a
layer
with
14
megs
of
changes
and,
let's
see
if
we
remove
so
this
has
added
the
cnb
lifecycle
and
launcher
which
provides
the
analyze,
build,
create,
detect
and
so
forth
commands.
And
then
this
actually
has
our
bit
our
bin
build
our
build
and
detect
commands
and
our
buildpack.toml
and
then
there's
the
order
that
the
thing
should
be
running,
what
stack
it's
using
and
then,
if
we
look
at
this.
E
A
A
Else,
so
I
think
this
is
a
case
where
I
would
actually
want
to
install
crane
locally
instead,
but
I'm
not
gonna
bore
people
with
that
right
now.
If
we
look
at
that
other,
if
we
look
at
the
config
for
cnb's.
A
Builder
yeah
dive
lets
you
brow
lets
you
browse
the
files
in
the
layers.
Crane
actually
lets
you
poke
at
the
layers
as
well.
Let's
see
here
is.
D
A
So
crane
will
unpack
all
let's
feed
it
to
jq,
and
so
this
will
show
you
all
the
different
layers
and
all
the
different
metadata
with
crane
config.
You
can
also
oops
yeah,
so
crane
append
will
let
you
take
a
tarball
and
add
it
on
to
an
image.
So
you
can
actually
build
a
new
image
with
just
a
new
tarball
to
add
a
new
layer.
A
Blob
will
let
you
read
out
one
of
these
layers
into
a
targe
zip
without
needing
to
fetch
everything
down
and,
let's
see
what
are
some
of
the
other
export
will
take
all
the
different
layers
and
collapse
them
into
a
single
tarball,
which
makes
it
handy
for
if
you
want
to
just
see,
what's
in
there
list
the
tags
in
a
repos.
What
ls
is.
A
A
A
So
yeah
dive
is
great
for
figuring
out
what's
in
the
files,
and
then
crane
is
great
for
figuring
out
the
container
registry
metadata.
So
I
tend
to
use
those
a
lot
when
I'm
figuring
when
I'm
poking
at
registry
things.
A
Is
but
apparently,
if
we're
building
off
of
the
ubuntu
bionic
image,
we
get
python36,
but
hopefully
36
is
new
enough
for
what
we
want.
A
Yes,
oh
it's
pack
build
pack
builder
is
actually
a
d.
The
naming
here
is
unfortunate
for
those
of
you
who
are
in
cloud
native,
build
packs
and
are
looking
at
this.
A
A
So
pack
builder
creates
a
builder
image,
so
it
takes
your
base
image
that
you're
going
to
run
all
of
your
software
on,
and
it
adds
your
build
packs
on
top
of
it,
so
that
all
your
build
packs
get
packaged
up
and
can
run,
and
that's
an
image
that
you
pass
around,
that
your
developers
will
fetch
and
use
to
actually
build
their
software
pack
build,
which
is
two
letters.
Less
is
when
you
take
your
source
code
and
you
feed
it
through
a
builder
created
through
pack
builder.
A
So
note
this
pack
builder
create
command
is
creating
a
builder
image
named
pi
builder
and
then
pack
build
has
a
builder
flag.
That's
using
that
pi
builder
that
I
just
built,
along
with
a
path
to
the
source
code.
A
It
does
sort
of
feel
like
everything
has
to
start
with
build,
which
is
not
great.
Okay,
oh,
it's
called
python3
and
it
looks
like
there
isn't
a
python.
So
if
we
change
this
to
which
python
three
naming
is
hard,
I
completely
agree
and
the
way
you
name
things
affects
how
you
think
about
them.
So
it's
really
important
too
so
yeah.
E
A
A
A
Oh,
I
still
still
call
it
still
said:
python
3.,
it
turns
out
set,
doesn't
work
so
well
there.
So.
D
A
E
E
B
A
D
C
C
E
A
Okay,
let's
see,
I
think
this
may
be
because
I
don't
have
an
init.py
marking
this
as
a
module.
So
let's
see.
D
E
A
Yeah,
I
don't
so
I'm
gonna
work
on
this
later
anyway.
This
was
a
project
that
I've
been
wanting
to
do
so
I
wanted
to
be
able
to
imp
to
in
detect
import
the
local
directory
and
figure
out
if
it
had
a
function
with
a
certain
annotation.
A
E
A
A
D
A
E
D
A
Oh
there's
a
launcher
command
that
it's
sticking
in
there
that
will
go
and
execute
the
right
whatever
the
right
command.
Is
I've
forgotten
about
that?
So
if
we
go
back
and
do
the
same
thing
for
my
app
that
we
built
at
the
beginning,
that
was
the
java
maven
spring
boot
app.
B
D
B
Nope,
I'm.
A
That
java
image
that
we
built
at
the
beginning
was
well
didn't
get
quite
as
far
as
I
expected
to
here,
but
I
did
manage
to
build
a
base
stack
that
included
python
and
start
using
python
in
my
detect
script,
so
that
I
could
determine
if
there
was
actually
a
function
there,
like
one
thing
I
might
decide
to
do,
would
be
to
figure
out.
Is
there
a
main?
A
If
there's
a
main,
I
probably
shouldn't
inject
my
own
main
for
transforming
a
function
into
an
http
server?
If
there
isn't
a
main,
then
maybe
I
do
that
and
I
figure
out
which
functions.
Look
like
they're
likely
to
be
things
that
you
want
to
expose
through
the
web
service-
and
I
you
know,
maybe
there's
annotations
on
them
or
maybe
I
add
the
annotations
and
I
wrap
it
up
into
a
flask
application.
A
So
that's
kind
of
the
idea
for
what
I'm
going
to
be
playing
with
over
the
next
few
days
and
I'll
probably
commit
some
of
the
files
that
you
saw
today
up
to
github.
So
you
can
follow
along
there.
A
A
A
Yeah
so
for
java,
jib
is
a
competitor
here.
Jib
is
a
sort
of
a
local
build
tool.
So
I
think
that
there,
I
think,
there's
probably
some
synergy
between
jib
and
pack
in
that
you
could
actually
have
a
cloud
native
builder
that
used
jib
to
do
that
build
and
then
you
don't
necessarily
have
to
have
docker
installed
locally,
although
maybe
you
install
docker
locally
to
run
pac,
but
if
you're
using
something
like
tekton
to
kick
off
your
ci
cd,
then
that's
that
should
give
you
what
you
need.
A
You
know
I
I
hate
installing
all
this
stuff
on
my
machine,
because
you
know
I'm
running
it
off
my
desktop,
but
lots
of
people
have
one
of
these
as
well
as
a
desktop.
Here
we
go
and
so
like
once
you
have
two
machines
and
you're
trying
to
keep
your
tools
in
sync
on
each.
It's
not
fun.
A
So
yeah,
hopefully
this
was
interesting
and
exciting
and
yeah
go
play
with
cloud
native,
build
packs
but
yeah.
If
someone
wants
to
suggest
jib
as
a
topic
as
well,
I
think
there
might
have
been
an
earlier
look
at
either
jib
or
co,
which
are
similar
tools.
Co
is
for
go,
and
jib
is
for
java
that
lets.
You
build
a
docker
image
sort
of
natively
using
the
container
registry
apis
rather
than
using,
rather
than
using
the
docker
client
and
building
up
layers.
That
way
so
have
a
good.