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 update code from git to a Docker container
  • Destroy Docker container from Marathon kills Mesos slave
  • Storage requirement when using for AWS ECS
  • Ubuntu docker container with upstart and syslog
  • Query to dataframe very slow on Zeppelin
  • Docker base image running slowly Mac OS X
  • /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
    

  • How can one Docker container call another Docker container
  • Docker error trying login (and anything)
  • Run docker after building own image
  • How to add user with dockerfile?
  • how process static file when deploying django using docker and aws eb
  • docker run registry error 301 response missing Location header
  • 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.