将文件添加到启动期间要使用的docker容器

是否可以在启动容器期间使用run操作期间将文件提供给docker工人容器?

基本上我想提供一个类似于jenkins docker中的 plugins.txt到txtcat服务器的txt文件。 该文件应包含在启动容器期间要下载的.war和.jar文件的名称和版本( name:version )。 我希望这种设置能够更灵活地为客户提供定制的容器,而不是为客户提供特定的图像。 但是对我来说,最大的问题是:

  1. 我可以在启动容器时提供这样的文件吗?
  2. 我应该如何处理文件和/或容器的版本,以便能够检查客户特定容器包含的内容?
  3. 还有什么我应该考虑的?

有3种方法将configuration数据提供给容器。

  1. 在build造时间

    将其添加到Dockerfile。 例如:

     COPY ./config.txt /var/local/myapp/ 

    每次更改configuration时都需要创build一个新映像。 如果您打算存储密码,证书或其他秘密,使用这种技术也是一个坏主意。

  2. 通过环境

     docker run -e name1=version1 -e name2=version2 imagename 

    这是传递一些参数的好方法。 不适合传递整个文件。

  3. 通过文件传递

    如果您使用Docker for Mac / Windows或Docker Toolbox(VirtualBox),则可以按照@BMitch所述的方法将本地目录挂载到Docker容器中。

    对于生产系统,主机将是远程的,因此您需要将文件复制到主机或主机上的卷上。 例如:

     # Copy to host docker-machine scp config.txt host-name:/dir/on/host 

    或复制到我在这个其他答案中描述的主机上的卷。

版本控制可以通过设置一个环境variables来处理。 例如:

 docker run --name myservice -e VERS=2.0.1 myimage 

您可以使用docker API在运行时检索。 例如:

 docker inspect --format "{{index (index .Config.Env) 0 }}" myservice 

这打印

 VERS=2.0.1 

您可以将单个文件作为卷挂载到容器中:

 docker run -v `pwd`/conf.txt:/app/conf.txt my_app 

这需要在Docker主机上运行,​​或者在Windows / MacOS上的User目录下运行。 您还可以在Docker中创build一个命名卷,您可以在其中存储这些文件并通过临时容器进行更新。

使用这些卷装,你需要小心许可,容器内的uid可能与主机上的uid不匹配。 您还可以使用附加到卷装的简单:ro来挂载只读文件。

对于那些试图用Windows容器来做这件事的人来说,

使用基于Windows的容器时,以下示例将失败,因为容器内的卷的目标或绑定装入必须是以下之一:不存在或空目录; 或C:以外的驱动器。 此外,绑定挂载的源必须是本地目录,而不是文件。

https://docs.docker.com/engine/reference/commandline/run/#mount-volume–v-read-only