How to run command during Docker build which requires a tty?

前端 未结 3 901
清酒与你
清酒与你 2021-01-12 15:49

I have some script I need to run during a Docker build which requires a tty (which Docker does not provide during a build). Under the hood the script uses the read

3条回答
  •  星月不相逢
    2021-01-12 16:16

    RUN in Dockerfile reference:

    shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows

    let's see what exactly /bin/sh is in ubuntu:14.04:

    $ docker run -it --rm ubuntu:14.04 bash
    root@7bdcaf403396:/# ls -n /bin/sh
    lrwxrwxrwx 1 0 0 4 Feb 19  2014 /bin/sh -> dash
    

    /bin/sh is a symbolic link of dash, see read function in dash:

    $ man dash
    ...
    read [-p prompt] [-r] variable [...]
                The prompt is printed if the -p option is specified and the standard input is a terminal.  Then a line
                is read from the standard input.  The trailing newline is deleted from the line and the line is split as
                described in the section on word splitting above, and the pieces are assigned to the variables in order.
                At least one variable must be specified.  If there are more pieces than variables, the remaining pieces
                (along with the characters in IFS that separated them) are assigned to the last variable.  If there are
                more variables than pieces, the remaining variables are assigned the null string.  The read builtin will
                indicate success unless EOF is encountered on input, in which case failure is returned.
    
                By default, unless the -r option is specified, the backslash ``\'' acts as an escape character, causing
                the following character to be treated literally.  If a backslash is followed by a newline, the backslash
                and the newline will be deleted.
    ...
    

    read function in dash:

    At least one variable must be specified.

    let's see read function in bash:

    $ man bash
    ...
    read  [-ers]  [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name...]
    If  no names are supplied, the line read is assigned to the variable REPLY.  The return code is zero,
                  unless end-of-file is encountered, read times out (in which case the  return  code  is  greater  than
                  128), or an invalid file descriptor is supplied as the argument to -u.
    ...
    

    So I guess your script myscript.sh is start with #!/bin/bash or something else but not /bin/sh.

    Also, you can change your Dockerfile like below:

    FROM ubuntu:14.04
    RUN echo yes | read ENV_NAME
    

    Links:

    • https://docs.docker.com/engine/reference/builder/
    • http://linux.die.net/man/1/dash
    • http://linux.die.net/man/1/bash

提交回复
热议问题