1

This is my Dockerfile:

FROM tomcat:9

RUN apt-get update
RUN apt-get install -y iputils-ping file

ARG TARGETARCH
RUN if ["$TARGETARCH" = "amd64"]; then  \
    apt-get install -y libc6-i386 ;  \
    fi

WORKDIR /usr/local/tomcat
... // skipped

The problem is the libc6-i386 package. It just cannot be installed on amd64 architecture. I am building docker images on my Mac M2 machine (not sure if this is the problem), with this command:

docker buildx build --platform linux/amd64,linux/arm64 --push -t foobar .

It can successfully build 2 architecture images, but amd64 passes libc6-i386 package.

I tried to direct assign linux/amd64:

docker buildx build --platform linux/amd64 -t foobar .

And I can see the output:

[+] Building 26.1s (15/15) FINISHED
 => [internal] load .dockerignore                                                                                                           0.0s
 => => transferring context: 2B                                                                                                             0.0s
 => [internal] load build definition from Dockerfile                                                                                        0.0s
 => => transferring dockerfile: 3.37kB                                                                                                      0.0s
 => [internal] load metadata for docker.io/library/tomcat:9                                                                                 1.8s
 => [auth] library/tomcat:pull token for registry-1.docker.io                                                                               0.0s
 => CACHED [ 1/10] FROM docker.io/library/tomcat:9@sha256:39cb3ef7ca9...                  0.0s
 => => resolve docker.io/library/tomcat:9@sha256:39cb3ef7ca9005...                          0.0s
 => [internal] load build context                                                                                                           0.0s
 => => transferring context: 7.51kB                                                                                                         0.0s
 => [ 2/10] RUN apt-get update                                                                                                             14.7s
 => [ 3/10] RUN apt-get install -y iputils-ping file                                                                                        8.7s
 => [ 4/10] RUN if ["amd64" = "amd64"]; then      apt-get install -y libc6-i386 ;      fi                                                   0.1s
 => [ 5/10] WORKDIR /usr/local/tomcat

It is already comparing "amd64" = "amd64", but why doesn't it install libc6-i386 package?

Environments:

docker version 
Client:
 Cloud integration: v1.0.29
 Version:           20.10.21
 API version:       1.41
 Go version:        go1.18.7
 Git commit:        baeda1f
 Built:             Tue Oct 25 18:01:18 2022
 OS/Arch:           darwin/arm64
 Context:           default
 Experimental:      true

Server: Docker Desktop 4.15.0 (93002)
 Engine:
  Version:          20.10.21
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.18.7
  Git commit:       3056208
  Built:            Tue Oct 25 17:59:41 2022
  OS/Arch:          linux/arm64
  Experimental:     false
 containerd:
  Version:          1.6.10
  GitCommit:        770bd0108c32f3fb5c73ae1264f7e503fe7b2661
 runc:
  Version:          1.1.4
  GitCommit:        v1.1.4-0-g5fd4c4d
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0


docker buildx version
github.com/docker/buildx v0.9.1 ed00243a0ce2a0aee75311b06e32d33b44729689

What's the problem here?

mkrieger1
  • 19,194
  • 5
  • 54
  • 65
smallufo
  • 11,516
  • 20
  • 73
  • 111
  • yes . it does. I think many guys (like me) not so familiar with bash may encounter this problem when composing Dockerfile. ( I think the question should not be deleted) – smallufo Jan 02 '23 at 18:24

1 Answers1

2

I think it's related to space.

When I try to run this command and got this error:

$ if ["amd64" = "amd64"]; then echo hi ;      fi
[amd64: command not found

I change it to this command with 2 more space and works

$ if [ "amd64" = "amd64" ]; then echo hi ;      fi
hi

So you should change your script to:

RUN if [ "$TARGETARCH" = "amd64" ]; then  \
    apt-get install -y libc6-i386 ;  \
    fi
Xirehat
  • 1,155
  • 1
  • 8
  • 20
  • 1
    The `[` is not a special shell character, it's a command, `/bin/[`. It's like trying to run `ls/home` and getting an error that the binary `ls/home` does not exist. For the `if` built-in, any error is a non-zero exit, and therefore false. – BMitch Jan 02 '23 at 15:46
  • Thanks. I don't know sh/bash is so picky about spaces. – smallufo Jan 03 '23 at 03:08