将文件添加到启动期间要使用的docker容器
是否可以在启动容器期间使用run
操作期间将文件提供给docker工人容器?
基本上我想提供一个类似于jenkins docker中的 plugins.txt
到txtcat服务器的txt文件。 该文件应包含在启动容器期间要下载的.war和.jar文件的名称和版本( name:version
)。 我希望这种设置能够更灵活地为客户提供定制的容器,而不是为客户提供特定的图像。 但是对我来说,最大的问题是:
- 我可以在启动容器时提供这样的文件吗?
- 我应该如何处理文件和/或容器的版本,以便能够检查客户特定容器包含的内容?
- 还有什么我应该考虑的?
有3种方法将configuration数据提供给容器。
-
在build造时间
将其添加到Dockerfile。 例如:
COPY ./config.txt /var/local/myapp/
每次更改configuration时都需要创build一个新映像。 如果您打算存储密码,证书或其他秘密,使用这种技术也是一个坏主意。
-
通过环境
docker run -e name1=version1 -e name2=version2 imagename
这是传递一些参数的好方法。 不适合传递整个文件。
-
通过文件传递
如果您使用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