将文件添加到docker容器以在启动期间使用

时间:2016-09-09 15:24:41

标签: docker docker-compose dockerfile

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:2)

有三种方法可以为容器提供配置数据。

  1. 在构建时

    将其添加到Dockerfile。例如:

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

    每次更改配置时都需要创建新图像。如果您计划存储密码,证书或其他秘密,使用此技术也是一个坏主意。

  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
    

    或复制到我在此other answer中描述的主机上的卷。

  4. 可以通过设置环境变量来处理版本控制。例如:

    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
    

答案 2 :(得分:-1)

对于那些尝试使用Windows容器执行此操作的人来说,这只是一个旁注:

  

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

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