使用docker-compose将文件添加到标准图像

我不确定是否有什么明显的逃脱我,或者如果这是不可能的,但我正在试图与docker集线器的图像组成一个完整的应用程序堆栈。

其中之一是mysql,它支持通过卷添加自定义configuration文件,并从挂载目录运行.sql文件。

但是,我在运行docker-compose的机器上有这些文件,而不是在主机上。 在运行入口点/ cmd之前,没有办法从本地机器指定文件复制到容器中吗? 我是否真的必须为这种情况创build一切的本地图像?

选项A:将文件包含在图像中。 这是不太理想的,因为你正在将configuration文件与你的映像混合(应该只包含你的二进制文件,而不是你的configuration文件),但是满足仅使用docker-compose发送文件的要求。

这个选项是通过使用docker-compose来构build你的图像来实现的,并且这个构build将把构build目录中的任何文件发送到远程的docker引擎。 您docker-compose.yml将如下所示:

 version: '2' services: my-db-app: build: db/. image: custom-db 

而db / Dockerfile将如下所示:

 FROM mysql:latest COPY ./sql /sql 

入口点/ cmd将保持不变。 如果图像已经存在,您需要运行docker-compose up --build ,并且需要更改sql文件。


选项B:使用卷来存储您的数据。 这不能直接在docker-compose里面完成。 但是,将图像外部的文件包含在容器中是首选方法。 您可以使用docker CLI通过networking填充卷,并inputredirect以及像tar这样的命令来打包和解压缩通过stdin发送的文件:

 tar -cC sql . | docker run --rm -it -v sql-files:/sql \ busybox /bin/sh -c "tar -xC /sql" 

通过脚本运行,然后让同一个脚本反弹分贝容器重新加载该configuration。


选项C:使用某种networking连接的文件系统。 如果您可以在运行docker CLI的主机上configurationNFS,则可以使用以下选项之一连接到来自远程docker节点的那些NFS共享:

 # create a reusable volume $ docker volume create --driver local \ --opt type=nfs \ --opt o=addr=192.168.1.1,rw \ --opt device=:/path/to/dir \ foo # or from the docker run command $ docker run -it --rm \ --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,volume-opt=o=addr=192.168.1.1,volume-opt=device=:/host/path \ foo # or to create a service $ docker service create \ --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,volume-opt=o=addr=192.168.1.1,volume-opt=device=:/host/path \ foo 

选项D:使用swarm模式,可以在图像中包含文件作为configuration。 这允许通常需要推送到群中任何节点的configuration文件按需发送到服务正在运行的节点。 这使用docker-compose.yml文件来定义它,但swarm模式不使用docker-compose自身,所以这可能不符合您的具体要求。 您可以运行单节点群集模式群集,因此即使您只有一个节点,也可以使用此选项。 这个选项确实要求你的每一个sql文件都作为一个单独的configuration被添加。 docker-compose.yml将如下所示:

 version: '3.4' configs: sql_file_1: file: ./file_1.sql services my-db-app: image: my-db-app:latest configs: - source: sql_file_1 target: /sql/file_1.sql mode: 444 

然后,而不是docker-compose up ,你会运行一个docker stack deploy -c docker-compose.yml my-db-stack

这是我如何与卷:

 services: my-db-app: command: /shell_scripts/go.sh volumes: - ./shell_scripts:/shell_scripts 

我的名声太低,无法评论,因此我正在创build一个新的答案, Adam Spence的答案是缺less“ – ”的卷选项,因为卷必须是一个数组,如下:

 services: my-db-app: command: /shell_scripts/go.sh volumes: - ./shell_scripts:/shell_scripts 

作为这个问题的一个更新的更新:例如,在Amazon上托pipe的docker swarm,您可以定义一个可由服务共享的卷,并且可以在群的所有节点上使用(使用cloudstor驱动程序, AWS EFS潜在的持久性)。

 version: '3.3' services: my-db-app: command: /shell_scripts/go.sh volumes: shell_scripts:/shell_scripts volumes: shell_scripts: driver: "cloudstor:aws"