如何使用commit“--change”标志更新Docker容器PATH?

时间:2018-03-12 12:32:40

标签: docker

我一直在尝试使用docker commit --change ...标志来更新容器PATH env变量值,但我必须对所涉及的某些部分缺乏了解,因为我无法获得所需的结果。

假设:

$ docker run -it centos:6 /bin/bash
[root@3b459018aa84 /]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
exit

尝试1:

$ docker commit -c "ENV PATH /usr/local/texlive/bin:${PATH}" 3b459018aa84 test-changes
$ docker run -it test-changes /bin/bash
[root@25116cd93d79 /]# echo $PATH
/usr/local/texlive/bin:/opt/local/bin:/opt/local/sbin:/Users/Ivan/.jenv/shims:/Users/Ivan/.jenv/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin:/usr/local/share/dotnet:/opt/X11/bin

结果PATH似乎包含主机的PATH值。我猜这是因为我使用了双引号导致${PATH}在传递给docker commit之前被扩展。

尝试2:

$ docker commit -c 'ENV PATH /usr/local/texlive/bin:${PATH}' 3b459018aa84 test-changes
$ docker run -it test-changes /bin/bash
[root@c10a98a7fbce /]# echo $PATH
/usr/local/texlive/bin:

尝试3:

$ docker commit -c "ENV PATH=\"/usr/local/texlive/bin:${PATH}\"" 3b459018aa84 test-changes
$ docker run -it test-changes /bin/bash
[root@240c3e268d08 /]# echo $PATH
/usr/local/texlive/bin:/opt/local/bin:/opt/local/sbin:/Users/Ivan/.jenv/shims:/Users/Ivan/.jenv/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin:/usr/local/share/dotnet:/opt/X11/bin:/Library/Frameworks/Mono.framework/Versions/Current/Commands

尝试4:

$ docker commit -c 'ENV PATH=\"/usr/local/texlive/bin:${PATH}\"' 3b459018aa84 test-changes
$ docker run -it test-changes /bin/bash
[root@bb10d27f1360 /]# echo $PATH
"/usr/local/texlive/bin:"

尝试5:

$ docker commit -c 'ENV PATH="/usr/local/texlive/bin:${PATH}"' 3b459018aa84 test-changes
$ docker run -it test-changes /bin/bash
[root@a683ab06f4d3 /]# echo $PATH
/usr/local/texlive/bin:

尝试6:

再次阅读docker commit文档后,我看到了--pause标记。因此,我测试了一个理论,即暂停容器会影响提交期间对环境变量的访问。

$ docker commit -c 'ENV PATH="/usr/local/texlive/bin:${PATH}"' -p=false 3b459018aa84 test-changes
$ docker run -it test-changes /bin/bash
/usr/local/texlive/bin:

不,也没有运气......

期望的输出:

[root@c10a98a7fbce /]# echo $PATH
/usr/local/texlive/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

换句话说,我希望输出就像将ENV PATH /usr/local/texlive/bin:${PATH}添加到Dockerfile一样。

我猜我错过了一些愚蠢的东西,希望对其他人显而易见,但我没有想法。

如果遇到这种情况,我将在Mac OS 10.13.2,Docker 17.12.0-ce-mac55(23011)上运行。

2 个答案:

答案 0 :(得分:1)

第一步:访问容器的$ PATH变量

您可以使用inspect

执行此操作
docker container inspect container_name --format '{{ index .Config.Env 0 }}'

第二步:向$ PATH附加内容并提交新图像

我将把上一步中的命令放在``(反引号),

docker container commit -c "ENV `docker container inspect container_name --format '{{ index .Config.Env 0 }}':some_other_path_goes_here`" container_name new_image_name

访问以下问题,了解其工作原理:

  

What does ` (backquote/backtick) mean in commands?

     

在主命令之前shell会评估(执行)您在反引号之间输入的所有内容,并且该命令会使用该执行的输出,就像您在命令行中在该位置键入该输出一样

实施例

  1. 运行一个新容器并回显其$ PATH变量:

    $ docker container run --rm -itd --name my_container ubuntu
    25b357a26d68f047dd98c87ff4598800db160ad3136470f3285ccd20c1297cfa
    
    $ docker container exec -it my_container /bin/sh -c 'echo $PATH'
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    
  2. 通过在旧的$ PATH值附加内容来提交新图像(注意容器没有停止或暂停):

    $ docker container commit -c "ENV `docker container inspect my_container --format '{{ index .Config.Env 0 }}':some_other_path_goes_here`" my_container new_image_name
    sha256:584226328c3da8b6239ec8f8b92f71ce2e03090341c6efb03602055fbf1ff582
    
  3. 根据该图像运行一个新容器并回显其$ PATH变量:

    $ docker container run --rm -itd --name my_new_container new_image_name
    40279673d0c45de7ab53d6be488d6ff32259e3bc8a76bd2ef41a53f065a2ba30
    
    $ docker container exec -it my_new_container /bin/sh -c 'echo $PATH'
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:some_other_path_goes_here
    

答案 1 :(得分:0)

在这个特殊场景中,对我来说最好的选择是升级到Docker Edge版本(写作时为18.02),因为它是bug in Moby Project导致使用Dockerfile和--change标志之间的区别提交。