Multistage dockerfile - missing file - docker

I have written a multistage build dockerfile trying to follow https://docs.docker.com/engine/userguide/eng-image/multistage-build/ :
FROM gcc:latest as compiler
WORKDIR /compiling/
ADD hello.c .
RUN gcc ./hello.c -o .hello
FROM scratch
WORKDIR /running/
COPY --from=compiler /compiling/hello .
CMD ["./hello"]
I expect that it builds an executable in a /compiling directory, copies it to /running directory and runs it there. However, I get this output:
C:\hellonode3>docker build -t hello-node3:v6 .
Sending build context to Docker daemon 4.608kB
Step 1/8 : FROM gcc:latest as compiler
---> 81ffb25b1dec
Step 2/8 : WORKDIR /compiling/
---> Using cache
---> 2337f71a826d
Step 3/8 : ADD hello.c .
---> Using cache
---> aaef6bd8d2ff
Step 4/8 : RUN gcc ./hello.c -o .hello
---> Using cache
---> 665f96147ec3
Step 5/8 : FROM scratch
--->
Step 6/8 : WORKDIR /running/
---> Using cache
---> 84f8d58a56a1
Step 7/8 : COPY --from=compiler /compiling/hello .
COPY failed: stat /var/lib/docker/overlay2/4fd98195ec5ffdb392e2d5d64c8f9acdde56c1c1e517cd9076ee9fd59ab2c4dc/merged/compiling/hello: no such file or directory
I do not exactly know why this happens. Can you explain? How can it be fixed?

Just a stupid typo!
There should be a line
RUN gcc ./hello.c -o ./hello
instead.

Related

Golang - problem with creating docker image

I try to make docker image, but when I run cmd in terminal.
sudo docker build testapi .
I get an error:
=> ERROR [6/6] RUN go build -o /app/testapi/cmd/test-api 0.3s
------
> [6/6] RUN go build -o /app/testapi/cmd/test-api:
#14 0.231 no Go files in /app
------
executor failed running [/bin/sh -c go build -o /app/testapi/cmd/test-api]: exit code: 1
File structure
/testapi
/cmd
/test-api
maing.go
/pkg
/...
Dockerfile
Dockerfile:
FROM golang:1.16-alpine
WORKDIR /app
COPY go.mod ./
RUN go mod download
COPY . ./
RUN go build -o /app/testapi/cmd/test-api
EXPOSE 8080
CMD [ "/testapi/cmd/test-api" ]
Try this way.
Also do not forget to add go.sum in Dockerfile if you have. COPY go.sum .
FROM golang:1.16-alpine
WORKDIR /app
COPY go.mod .
COPY . .
RUN go build -o main ./cmd/<FOLDER_NAME>
WORKDIR /dist
RUN cp /app/main .
EXPOSE 3000
CMD ["/dist/main"]
Works fine
Status: Downloaded newer image for golang:1.16-alpine
---> 7642119cd161
Step 2/9 : WORKDIR /app
---> Running in f8ad2994262c
Removing intermediate container f8ad2994262c
---> 6e079707cc3e
Step 3/9 : COPY go.mod .
---> c79a0cc04ff5
Step 4/9 : COPY . .
---> 897027112e73
Step 5/9 : RUN go build -o main ./cmd/api
---> Running in eb4579f1c339
Removing intermediate container eb4579f1c339
---> e41f6e5542a4
Step 6/9 : WORKDIR /dist
---> Running in 92115865d1ec
Removing intermediate container 92115865d1ec
---> 8152a0ebe4bc
Step 7/9 : RUN cp /app/main .
---> Running in 5c68cb195826
Removing intermediate container 5c68cb195826
---> 6f2e1fb8a611
Step 8/9 : EXPOSE 3000
---> Running in fba77820c1ec
Removing intermediate container fba77820c1ec
---> 182a624d807a
Step 9/9 : CMD ["/dist/main"]
---> Running in 164ba25694bd
Removing intermediate container 164ba25694bd
---> 7cf22cffc472
Successfully built 7cf22cffc472
Successfully tagged bla:latest
go build [-o output] [build flags] [packages]

Dockerfile RUN - file not found

I'm trying to execute (RUN) a script but I'm getting a not file found error:
The line is: RUN settings/certs/install-certs.sh
The other lines that use files from the same path don't cause any issues.
What Am I missing here?
Dockerfile:
FROM container-registry.foo.net/maven:3.6.1-alpine as build
WORKDIR /app
COPY . .
RUN chmod +x settings/certs/install-certs.sh
RUN settings/certs/install-certs.sh
RUN mvn clean install -s settings/maven/docker-settings.xml
Output:
Sending build context to Docker daemon 218MB
Step 1/13 : FROM container-registry.foo.net/maven:3.6.1-alpine as build
---> 7445f83cd169
Step 2/13 : WORKDIR /app
---> Using cache
---> b08dcd4a3395
Step 3/13 : COPY . .
---> Using cache
---> c843717f9c58
Step 4/13 : RUN chmod +x settings/certs/install-certs.sh
---> Using cache
---> 17c6546c749b
Step 5/13 : RUN settings/certs/install-certs.sh
---> Running in 106d58b6bb25
/bin/sh: settings/certs/install-certs.sh: not found
The command '/bin/sh -c settings/certs/install-certs.sh' returned a non-zero code: 127
It turn out the line separator was the reason of the failure, replacing CRLF to LF did the trick.
Hard to identify when the error says "file not found".

Docker build not using cache

When I run
docker build -f docker/webpack.docker services/webpack --build-arg env=production
twice in a row, Docker builds my image each time, starting from the first RUN (the COPY uses the cache).
FROM node:lts
ARG env=production
ENV NODE_ENV=$env
WORKDIR /app
COPY package.json yarn.lock ./
RUN yarn install --frozen-lockfile --production=false --non-interactive
COPY . .
RUN node --max-old-space-size=20000 node_modules/.bin/svg2fonts icons -o assets/markons -b mrkn -f markons -n Markons
RUN node --max-old-space-size=20000 node_modules/.bin/webpack --progress
How can I get it to cache those RUNs?
Output looks like:
Sending build context to Docker daemon 3.37MB
Step 1/9 : FROM node:lts
---> 0c601cba9f11
Step 2/9 : ARG env=production
---> Using cache
---> dd38b2167c75
Step 3/9 : ENV NODE_ENV=$env
---> Using cache
---> 800f5afd416c
Step 4/9 : WORKDIR /app
---> Using cache
---> d15b93dce11d
Step 5/9 : COPY package.json yarn.lock ./
---> Using cache
---> a049dd1609a8
Step 6/9 : RUN yarn install --frozen-lockfile --production=false --non-interactive
---> Using cache
---> d5e51b0d556c
Step 7/9 : COPY . .
---> 92990e326d4b
Step 8/9 : RUN node --max-old-space-size=20000 node_modules/.bin/svg2fonts icons -o assets/markons -b mrkn -f markons -n Markons
---> Running in a23878db7b0e
Wrote assets/markons/markons.css
Wrote assets/markons/markons.js
Wrote assets/markons/markons.html
Wrote assets/markons/markons-chars.json
Wrote assets/markons/markons.svg
Wrote assets/markons/markons.ttf
Wrote assets/markons/markons.woff
Wrote assets/markons/markons.woff2
Wrote assets/markons/markons.eot
Removing intermediate container a23878db7b0e
---> 3bce79d0ecf0
Step 9/9 : RUN node --max-old-space-size=20000 node_modules/.bin/webpack --progress
---> Running in b6d460488950
<s> [webpack.Progress] 0% compiling
...
See the description:
If the contents of all external files on the first COPY command are
the same, the layer cache will be used and all subsequent commands
until the next ADD or COPY command will use the layer cache.
However, if the contents of one or more external files are different,
then all subsequent commands will be executed without using the layer
cache.
So every time the content is changed two last RUN will be executed with no cache. There is no way to control caching yet. Maybe it's a better option to specify volumes?

MSBUILD : error MSB1009: Project file does not exist when building docker file for an ASP.NET Core API application

I am trying to build a docker image for an ASP.NET Core 3.1 application and I fail to restore the packages. My solution has multiple projects and after copying all the project files, I am trying to create a layer which contains restored dependencies only.
The docker file
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /src
COPY ["ExampleApi/ExampleApi.csproj", "ExampleApi/ExampleApi/"]
COPY ["Common.Web/Common.Web.csproj", "ExampleApi/Common.Web/"]
COPY ["Example.Data/Example.Data.csproj", "ExampleApi/Example.Data/"]
COPY ["Example.Services/Example.Services.csproj", "ExampleApi/Example.Services/"]
RUN mkdir /tmp/build/
COPY . /tmp/build
RUN find /tmp/build -name *.csproj
RUN dotnet restore "ExampleApi/ExampleApi.csproj" --verbosity detailed
COPY . .
WORKDIR "/src/ExampleApi/ExampleApi"
RUN dotnet build "ExampleApi.csproj" -c Release -o /app --no-restore
FROM build AS publish
RUN dotnet publish "ExampleApi.csproj" -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "ExampleApi.dll"]
Docker build
I am running without cache to be able to output all the csproj files within the container for each run (otherwise it gets cached and the files are not longer displayed).
docker build --no-cache -f ExampleApi/Dockerfile .
Sending build context to Docker daemon 116.4MB
Step 1/22 : FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base
---> a843e0fbe833
Step 2/22 : WORKDIR /app
---> Running in e33e9c821c0b
Removing intermediate container e33e9c821c0b
---> eec973a226e0
Step 3/22 : EXPOSE 80
---> Running in 8e813a3a8b85
Removing intermediate container 8e813a3a8b85
---> c8d95a3a1de4
Step 4/22 : FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
---> cef7866e800b
Step 5/22 : WORKDIR /src
---> Running in f56bf9402ed1
Removing intermediate container f56bf9402ed1
---> 55694332db0e
Step 6/22 : COPY ["ExampleApi/ExampleApi.csproj", "ExampleApi/ExampleApi/"]
---> 4beb2e169ec7
Step 7/22 : COPY ["Common.Web/Common.Web.csproj", "ExampleApi/Common.Web/"]
---> ed7a9c81e8f7
Step 8/22 : COPY ["Example.Data/Example.Data.csproj", "ExampleApi/Example.Data/"]
---> aaca52c111b4
Step 9/22 : COPY ["Example.Services/Example.Services.csproj", "ExampleApi/Example.Services/"]
---> efb15c17a096
Step 10/22 : RUN mkdir /tmp/build/
---> Running in 7da9eae324ca
Removing intermediate container 7da9eae324ca
---> b06126b19a7f
Step 11/22 : COPY . /tmp/build
---> 04598eaab98c
Step 12/22 : RUN find /tmp/build -name *.csproj
---> Running in 2fd26dba963d
/tmp/build/ExampleApi/ExampleApi.csproj
/tmp/build/Example.Data/Example.Data.csproj
/tmp/build/Common.Web/Common.Web.csproj
/tmp/build/Example.Sql/Example.!Sql.csproj
/tmp/build/Example.Services/Example.Services.csproj
/tmp/build/Example.Services.Tests/Example.Services.Tests.csproj
/tmp/build/Example.IdentityServer.Infrastructure/Example.IdentityServer.Infrastructure.csproj
/tmp/build/Example.IdentityServer/Example.IdentityServer.csproj
/tmp/build/Example.Data.Tests/Example.Data.Tests.csproj
/tmp/build/ExampleIntegrationApi/ExampleIntegrationApi.csproj
Removing intermediate container 2fd26dba963d
---> 78eadf796305
Step 13/22 : RUN dotnet restore "ExampleApi/ExampleApi.csproj" --verbosity detailed
---> Running in 5dc9b5bbd04e
MSBUILD : error MSB1009: Project file does not exist.
Switch: ExampleApi/ExampleApi.csproj
The command '/bin/sh -c dotnet restore "ExampleApi/ExampleApi.csproj" --verbosity detailed' returned a non-zero code: 1
find indicates that ExampleApi/ExampleApi.csproj is there, yet the dotnet restore complains about not finding it.

How to run go server on docker from binary

I have been trying to make a Dockerfile, that would let me build my go server as binary and then run it either from the scratch image or alpine. The server works fine locally, on macOS 10.13.5, and I made it work when it wasn't from binary on Docker.
I keep getting this error:
standard_init_linux.go:190: exec user process caused "exec format error"
I have been googling around and found something about system architecture. I am not sure how to check if that is the error and/or how to fix it.
Any hints for debugging or possible fix are much appreciated.
My Dockerfile:
FROM golang:1.10.3 as builder
WORKDIR /go/src/gitlab.com/main/server
COPY . .
RUN go get -d -v ./...
RUN CGO_ENABLED=0 GOOS=linux go build -a -o main .
FROM scratch
ADD main /
CMD ["/main"]
The output:
Building go
Step 1/9 : FROM golang:1.10.3 as builder
---> 4e611157870f
Step 2/9 : WORKDIR /go/src/gitlab.com/main/server
Removing intermediate container 20cd4d66008b
---> 621d9fc02dde
Step 3/9 : COPY . .
---> cab639571baf
Step 4/9 : RUN go get -d -v ./...
---> Running in 7681f9adc7b2
Removing intermediate container 7681f9adc7b2
---> 767a4c9dfb94
Step 5/9 : RUN go build -a -installsuffix cgo -o main .
---> Running in a6ec73121163
Removing intermediate container a6ec73121163
---> b9d7d1c0d2f9
Step 6/9 : FROM alpine:latest
---> 11cd0b38bc3c
Step 7/9 : WORKDIR /app
---> Using cache
---> 6d321d334b8f
Step 8/9 : COPY . .
---> 048a59fcdd8f
Step 9/9 : CMD ["/app/main"]
---> Running in d50d174644ff
Removing intermediate container d50d174644ff
---> 68f8f3c6cdf7
Successfully built 68f8f3c6cdf7
Successfully tagged main_go:latest
Creating go ... done
Attaching to go
go | standard_init_linux.go:190: exec user process caused "exec format error"
go exited with code 1
As #tgogos pointed out did I need to use what I build in the first step.
My final Dockerfile ended like this with a few further improvements: The important part is second last line though:
FROM golang:1.10.3 AS build
WORKDIR /go/src/gitlab.com/main/server
COPY . .
RUN go get github.com/golang/dep/cmd/dep && \
dep ensure && \
rm -f schema/bindata.go && \
go generate ./schema
RUN CGO_ENABLED=0 GOOS=linux go build -a -o main .
FROM alpine
RUN apk add --no-cache ca-certificates
COPY --from=build /go/src/gitlab.com/main/server/main .
CMD ["/main"]

Resources