Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dockerfile COPY ${source:-obj/Docker/publish} not finding the correct source after upgrade to 3.1

I am using Jenkins to build and deploy a .Net Core microservice application. For each microservice, I am building a docker container. My dockerfile has the following in it:

ARG source

COPY ${source:-obj/Docker/publish} .

Prior to upgrading from .Net Core 2.2 to 3.1, this worked. After the upgrade, when I try to deploy, I am getting the following error:

COPY failed: stat /var/lib/docker/tmp/docker-builder609391151/obj/Docker/publish: no such file or directory script returned exit code 1

From what I've read, it looks like .Net Core 2.2 compiled into the /obj/Docker/publish directory, but .Net Core 3.1 compiles into the /bin/Release/netcoreapp3.1 directory, however the source is still pointing to /obj/Docker/publish. I'm trying to figure out where the source arguement is defined, and how I should change this.

Update:

I decided to leave the source out entirely and hard-code the build path. I changed the copy line to

COPY /var/lib/jenkins/jobs/fusion-core/branches/master/workspace/src/CustomerAPI/obj/Release/netcoreapp3.1 .

I'm still getting an error when I try to build the docker container that says

COPY failed: stat /var/lib/docker/tmp/docker-builder356954794/var/lib/jenkins/jobs/fusion-core/branches/master/workspace/src/CustomerAPI/obj/Release/netcoreapp3.1: no such file or directory script returned exit code 1

I'm not sure where the "/var/lib/docker/tmp/docker-builder356954794" is coming from, or why it is appending it to the front of my path, but it doesn't exist.

Still not sure how to get around this.

like image 280
nherrmann Avatar asked Sep 06 '25 00:09

nherrmann


1 Answers

Some debugging suggestions in no certain order.

Default Value

${source:-obj/Docker/publish} is bash syntax that evaluates to the value of the variable source if it was defined, or obj/Docker/publish if it was not.

I'm trying to figure out where the source argument is defined, and how I should change this.

If you can't find anything that defines it to another value, it just means that the default value obj/Docker/publish was being used.

Publish directory

3.1 still uses the publish directory, but it will be at bin/Release/netcoreapp3.1/publish. Use a RUN find -type d -iname publish to find the publish directories in your container.

Dont use the full path, it will change every build. See the tmp/docker-builder356954794 in the path?

The COPY command uses relative files, based on the path in your machine (outside the docker container). So use a path that's relative to where the context directory (or Dockerfile) is. If the dockerfile is at /var/lib/jenkins/jobs/fusion-core/branches/master/workspace/src/CustomerAPI/Dockerfile and the publish directory on your machine is at /var/lib/jenkins/jobs/fusion-core/branches/master/workspace/src/CustomerAPI/bin/Release/netcoreapp3.1/publish, then use a COPY command like this:

COPY bin/Release/netcoreapp3.1/publish .

Funny paths

I'm not sure where the "/var/lib/docker/tmp/docker-builder356954794" is coming from

Containers need to share files from one directory (in your host) to another (in your container). Depending on the container technology, it uses one or more file systems or file directories.

One of those is /var/lib/docker/tmp/...

like image 71
omajid Avatar answered Sep 11 '25 20:09

omajid