Recently I was troubleshooting a customer problem in their on-premise cluster. But I was not sure where the problem lay. So I switched over to using my colleagues Docker Enterprise demo cluster that is running in Azure. In this heterogeneous cluster are 1 Universal Control Plan (UCP) manager, 1 Docker Trusted Registry (DTR), 2 Windows workers, and 1 Linux worker.
I was attempting to reproduce my customer’s problem. However, what should have been easy turned into a problem; or else I wouldn’t be writing about it. I could not even get to my customer’s problem until I resolved an issue with simply building a linux image against a heterogeneous (Windows and Linux workers) cluster. At the time, it felt rather silly and frustrating all at the same time. All I could do was wring my hands and groan.
I had downloaded my client bundle and sourced it in my
$ source env.sh
The next thing I needed was to build the docker image from my custom Dockerfile. The Dockerfile was based on nginx and had a custom nginx.conf loaded into the image.
$ cd ~/my-pp $ docker build -t my-app:1.0 . Sending build context to Docker daemon 4.096kB worker-win-2: Step 1/3 : FROM nginx:1.15.2 worker-win-2: Pulling from library/nginx worker-win-2: Failed to build image: no matching manifest for unknown in the manifest list entries
Ok, based on the last line of the log output it is not obvious what the issue is. However, if you look at the machine name that the build command was sent to, it becomes quite obvious what the problem is. I cannot build a linux based image on a windows machine. But how do I specify the target operating system on the command line?
I knew my friend Chuck had already encountered this problem. So this is what he told me to do; add the following option –build-arg ‘constraint:ostype==linux’ to my build command.
$ cd ~/my-app $ docker build --build-arg 'constraint:ostype==linux' -t my-app . Sending build context to Docker daemon 4.096kB worker-linux-1: Step 1/3 : FROM nginx:1.15.2 worker-linux-1: Pulling from library/nginx worker-linux-1: Pull complete worker-linux-1: Digest: sha256:d85914d547a6c92faa39ce7058bd7529baacab7e0cd4255442b04577c4d1f424 worker-linux-1: Status: Downloaded newer image for nginx:1.15.2 worker-linux-1: ---> c82521676580 worker-linux-1: Step 2/3 : EXPOSE 8443 worker-linux-1: ---> Running in 88e99ace1e12 worker-linux-1: Removing intermediate container 88e99ace1e12 worker-linux-1: ---> bd98a77c3b6b worker-linux-1: Step 3/3 : COPY nginx.conf /etc/nginx/ worker-linux-1: ---> 62b9f978af24 worker-linux-1: Successfully built 62b9f978af24 worker-linux-1: Successfully tagged my-app:latest
That’s it folks. Plain and simple.
$ docker build –build-arg ‘constraint:ostype==linux’ -t my-app .
In a heterogeneous cluster my builds are now targeting linux machines and not windows. Of course you can alternate the
to windows if that is your goal. Good luck and contact us at https://capstonec.com/contact-us/
Docker Accredited Consultant