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 check syslog for ubuntu docker
  • Docker 1.13.0 volume mapping file corruption
  • Freegeoip with Docker Cloud
  • Unable to run mariadb when mount volume
  • How to move docker installation to another machine?
  • Canonical way to checksum downloads in a Dockerfile?
  • /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
    

  • Sending docker logs to AWS CloudWatch via Terraform
  • docker images hierarchy managment
  • Cannot pull a newly created empty docker repo: repository not found
  • How do I attach VisualVM to a simple Java process running in a Docker container
  • How to create a public key store for microservices?
  • how to import a file as a parameter in Docker?
  • 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.