Cannot use process substitution during docker build because bash goes into posix mode

In a Dockerfile, I want to use process substitution:

RUN echo <(echo '$DATA:'"$DATA")

But docker build runs every RUN command with /bin/sh. Apparently being run as sh causes bash to switch to POSIX mode, which does not allow process substitution:

  • How to get `docker run` full arguments?
  • Script fails at build but works from Docker container
  • Docker cannot establish connection with postgresql in Travis CI
  • How does docker handle almost equal images?
  • Docker daemon is running but it cant connect
  • How do I hook up a Node/React application to a remote Informix server?
  • /bin/sh: -c: line 0: syntax error near unexpected token `('

    I tried switching off POSIX mode:

    RUN set +o posix && echo <(echo '$DATA:'"$DATA")

    But it seems the syntax error happens even before the first command is run. Same if I replace && with ;.

    Note that the command (even the one that I used as a simplified example here) contains both single and double quotes, so I can’t simply prepend bash -c.

    The used shell is actually a bash, but it is invoked as /bin/sh by docker:

    Step 7 : RUN ls -l /bin/sh
    ---> Running in 93a9809e12a7
    lrwxrwxrwx    1 root     root             9 Dec 28 03:38 /bin/sh -> /bin/bash

  • Efficiently using multiple docker containers in a single host
  • Can multiple Docker containers run using the same host/port?
  • Loopback handle connection issues (and startup crashes)
  • Can run ARM/rpi images in Docker on Windows but not linux
  • How can I specify image name with docker-compose
  • how force deleting docker image affects existing containers using it
  • One Solution collect form web for “Cannot use process substitution during docker build because bash goes into posix mode”

    Assuming your sh is not bash, you can’t use process substitution in shell mode directly; you need to spawn a bash session (non-login, non-interactive here):

    RUN [ "/bin/bash", "-c", "echo <(echo '$DATA:'\"$DATA\")" ]

    Here i have used the json (aka exec) form to make sure the quotes are easily managed, here you just need to escape quotes around $DATA: \"$DATA\" — to prevent json interpretation beforehand.

    If your sh is in fact bash, this should do:

    RUN "echo <(echo '$DATA:'"$DATA")"

    Also this just outputs the file descriptor, i am not rally sure about your plan.

    Docker will be the best open platform for developers and sysadmins to build, ship, and run distributed applications.