Here's yet another quickie: let's say you created a docker Ubuntu container to do some sort of cross compilation. You know, maybe your container is 64bit Intel and you need to spit out some static 32bit Intel stuff. Or PPC for that matter. Now your development environment needs the 32bit version of libncurses-dev, which for ubuntu 14.04 would be libncurses5-dev:i386. We do need to specify the architecture (:i386) if we are not using the default one..
So you scribble up a quick Dockerfile:
############################################################ # Dockerfile to build a ubuntu container image thingie # Based on Ubuntu (Duh!) ############################################################ # Set the base image to Ubuntu FROM ubuntu:14.04 ################## BEGIN INSTALLATION ###################### RUN apt-get update && apt-get -y upgrade RUN apt-get install -y build-essential curl libc6-dev libncurses5-dev:i386 ##################### INSTALLATION END #####################And then you do some building:
ducker@boot2docker:~/docker/test$ docker build -t raubvogel/test. Sending build context to Docker daemon 4.096 kB Sending build context to Docker daemon Step 0 : FROM ubuntu:14.04 ---> 6d4946999d4f Step 1 : RUN apt-get update && apt-get -y upgrade ---> Running in 2d035053a431 Ign http://archive.ubuntu.com trusty InRelease Ign http://archive.ubuntu.com trusty-updates InRelease Ign http://archive.ubuntu.com trusty-security InRelease Hit http://archive.ubuntu.com trusty Release.gpg [...] Processing triggers for ureadahead (0.100.0-16) ... Setting up initscripts (2.88dsf-41ubuntu6.2) ... guest environment detected: Linking /run/shm to /dev/shm ---> c1434c42218e Removing intermediate container 2d035053a431 Step 2 : RUN apt-get install -y build-essential zip bzr curl libc6-dev libncurses5-dev:i386 ---> Running in 2ac39f9430c2 Reading package lists... Building dependency tree... Reading state information... E: Unable to locate package libncurses5-dev INFO[0017] The command [/bin/sh -c apt-get install -y build-essential zip bzr curl libc6-dev libncurses5-dev:i386] returned a non-zero code: 100 ducker@boot2docker:~/docker/test$And then it barks at the libncurses5-dev entry. What's going on?
The Debian Multiarch HOWTO seems to have a bit of a clue. I was going to write a long winded explanation but I am bored. So here is the short version:
dpkg --add-architecture i386 apt-get update apt-get install libncurses5-dev:i386See the dpkg --add-architecture i386 line? It tells the host that we are can do 32bit Intell thingies. The next line is there just to feed us with the 32bit repository data, so when we look for a 32bit package we can get it. Let apply that to our Dockerfile:
############################################################ # Dockerfile to build a ubuntu container image thingie # Based on Ubuntu (Duh!) ############################################################ # Set the base image to Ubuntu FROM ubuntu:14.04 ################## BEGIN INSTALLATION ###################### # We need i386 crap RUN dpkg --add-architecture i386 # Business as usual RUN apt-get update && apt-get -y upgrade RUN apt-get install -y build-essential curl libc6-dev libncurses5-dev:i386 ##################### INSTALLATION END #####################And build it again.
ducker@boot2docker:~/docker/test$ docker build -t raubvogel/test. Sending build context to Docker daemon 4.608 kB Sending build context to Docker daemon Step 0 : FROM ubuntu:14.04 ---> 6d4946999d4f Step 1 : RUN dpkg --add-architecture i386 ---> Running in 89382c3c3469 ---> f367d3357fc4 Removing intermediate container 89382c3c3469 Step 2 : RUN apt-get update && apt-get -y upgrade ---> Running in 6d0fc9519029 Ign http://archive.ubuntu.com trusty InRelease Ign http://archive.ubuntu.com trusty-updates InRelease [...] Some packages could not be installed. This may mean that you have requested an impossible situation or if you are using the unstable distribution that some required packages have not yet been created or been moved out of Incoming. The following information may help to resolve the situation: The following packages have unmet dependencies: build-essential : Depends: gcc (>= 4:4.4.3) but it is not going to be installed Depends: g++ (>= 4:4.4.3) but it is not going to be installed E: Unable to correct problems, you have held broken packages. INFO[0002] The command [/bin/sh -c apt-get install -y build-essential zip bzr curl libc6-dev libncurses5-dev:i386] returned a non-zero code: 100 ducker@boot2docker:~/docker/test$Hmmm, that didn't work. Crap. Let's massage Dockerfile a bit:
############################################################ # Dockerfile to build a ubuntu container image thingie # Based on Ubuntu (Duh!) ############################################################ # Set the base image to Ubuntu FROM ubuntu:14.04 ################## BEGIN INSTALLATION ###################### # We need i386 crap RUN dpkg --add-architecture i386 # Business as usual RUN apt-get update && apt-get -y upgrade RUN apt-get install -y build-essential &&\ apt-get install -y zip bzr curl libc6-dev libncurses5-dev:i386 ##################### INSTALLATION END #####################And this time it works fine:
ducker@boot2docker:~/docker/test$ docker build -t raubvogel/test. Sending build context to Docker daemon 4.608 kB Sending build context to Docker daemon Step 0 : FROM ubuntu:14.04 [...] Setting up libpam-systemd:amd64 (204-5ubuntu20.12) ... debconf: unable to initialize frontend: Dialog debconf: (TERM is not set, so the dialog frontend is not usable.) debconf: falling back to frontend: Readline debconf: unable to initialize frontend: Readline debconf: (This frontend requires a controlling tty.) debconf: falling back to frontend: Teletype invoke-rc.d: unknown initscript, /etc/init.d/systemd-logind not found. invoke-rc.d: policy-rc.d denied execution of start. Processing triggers for libc-bin (2.19-0ubuntu6.6) ... Processing triggers for ca-certificates (20141019ubuntu0.14.04.1) ... Updating certificates in /etc/ssl/certs... 173 added, 0 removed; done. Running hooks in /etc/ca-certificates/update.d....done. Processing triggers for sgml-base (1.26+nmu4ubuntu1) ... Processing triggers for ureadahead (0.100.0-16) ... ---> d86a5113c577 Removing intermediate container 32e0cc9a0b5a Successfully built d86a5113c577 ducker@boot2docker:~/docker/test$
What I found out is that it does not like to have the build-essentials in the same install statement as libncurses5-dev:i386. The easiest solution is to have build-essentials on its own install statement and everyone else in the next one. And life is once again well.
No comments:
Post a Comment