是否可以在启动容器期间使用run
操作期间向docker容器提供文件?
基本上我想在jenkins docker中向tomcat服务器提供类似于plugins.txt
的txt文件。该文件应包含在容器启动期间下载的.war和.jar文件的名称和版本(name:version
)。我希望这种设置能够更灵活地为客户提供定制容器,而不是拥有客户特定的图像。但对我来说最重要的问题是:
答案 0 :(得分:2)
您可以将单个文件作为卷安装到容器中:
docker run -v `pwd`/conf.txt:/app/conf.txt my_app
需要在docker主机上运行,或在Windows / MacOS上的User目录下运行。您还可以在docker中创建一个命名卷,您可以在其中存储这些文件并通过临时容器进行更新。
使用这些卷装入时,您需要小心权限,容器内的uid可能与主机上的uid不匹配。您还可以使用附加到卷装载的简单:ro
来装载只读文件。
答案 1 :(得分:2)
有三种方法可以为容器提供配置数据。
在构建时
将其添加到Dockerfile。例如:
COPY ./config.txt /var/local/myapp/
每次更改配置时都需要创建新图像。如果您计划存储密码,证书或其他秘密,使用此技术也是一个坏主意。
通过环境
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
或复制到我在此other answer中描述的主机上的卷。
可以通过设置环境变量来处理版本控制。例如:
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