How do I edit a file after I shell to a Docker container?

后端 未结 16 1769
你的背包
你的背包 2020-11-29 14:22

I successfully shelled to a Docker container using:

docker exec -i -t 69f1711a205e bash

Now I need to edit file and I don\'t have any edito

相关标签:
16条回答
  • 2020-11-29 14:44

    You can also use a special container which will contain only the command you need: Vim. I chose python-vim. It assumes that the data you want to edit are in a data container built with the following Dockerfile:

    FROM debian:jessie
    ENV MY_USER_PASS my_user_pass
    RUN groupadd --gid 1001 my_user
    RUN useradd -ms /bin/bash --home /home/my_user \
                -p $(echo "print crypt("${MY_USER_PASS:-password}", "salt")" | perl) \
                --uid 1001 --gid 1001 my_user
    ADD src /home/my_user/src
    RUN chown -R my_user:my_user /home/my_user/src
    RUN chmod u+x /home/my_user/src
    CMD ["true"]
    

    You will be able to edit your data by mounting a Docker volume (src_volume) which will be shared by your data container (src_data) and the python-vim container.

    docker volume create --name src_volume
    docker build -t src_data .
    docker run -d -v src_volume:/home/my_user/src --name src_data_1 src_data
    docker run --rm -it -v src_volume:/src fedeg/python-vim:latest
    

    That way, you do not change your containers. You just use a special container for this work.

    0 讨论(0)
  • 2020-11-29 14:45

    Sometime you must first run the container with root:

    docker exec -ti --user root <container-id> /bin/bash
    

    Then in the container, to install Vim or something else:

    apt-get install vim
    
    0 讨论(0)
  • 2020-11-29 14:45

    An easy way to edit a few lines would be:

    echo "deb http://deb.debian.org/debian stretch main" > sources.list
    
    0 讨论(0)
  • 2020-11-29 14:47

    See Stack Overflow question sed edit file in place

    It would be a good option here, if:

    1. To modify a large file, it's impossible to use cat.
    2. Install Vim is not allowed or takes too long. My situation is using the MySQL 5.7 image when I want to change the my.cnf file, there is no vim, vi, and Vim install takes too long (China Great Firewall). sed is provided in the image, and it's quite simple. My usage is like

      sed -i /s/testtobechanged/textwanted/g filename

      Use man sed or look for other tutorials for more complex usage.

    0 讨论(0)
  • 2020-11-29 14:53

    You can use cat if it's installed, which will most likely be the case if it's not a bare/raw container. It works in a pinch, and ok when copy+pasting to a proper editor locally.

    cat > file
    # 1. type in your content
    # 2. leave a newline at end of file
    # 3. ctrl-c / (better: ctrl-d)
    cat file
    

    cat will output each line on receiving a newline. Make sure to add a newline for that last line. ctrl-c sends a SIGINT for cat to exit gracefully. From the comments you see that you can also hit ctrl-d to denote end-of-file ("no more input coming").

    Another option is something like infilter which injects a process into the container namespace with some ptrace magic: https://github.com/yadutaf/infilter

    0 讨论(0)
  • 2020-11-29 14:54

    If you don't want to add an editor just to make a few small changes (e.g., change the Tomcat configuration), you can just use:

    docker cp <container>:/path/to/file.ext .
    

    which copies it to your local machine (to your current directory). Then edit the file locally using your favorite editor, and then do a

    docker cp file.ext <container>:/path/to/file.ext
    

    to replace the old file.

    0 讨论(0)
提交回复
热议问题