当前位置: 首页 > 知识库问答 >
问题:

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

萧修永
2023-03-14

我不确定是有什么明显的东西逃过了我的视线,还是根本不可能,但我正试图用docker hub的图像组成一个完整的应用程序堆栈。

其中之一是mysql,它支持通过卷添加自定义配置文件并运行。装载目录中的sql文件。

但是,我在运行docker compose的机器上有这些文件,而不是在主机上。在运行entrypoint/cmd之前,是否无法指定要从本地计算机复制到容器中的文件?我真的需要为这种情况创建所有东西的本地图像吗?

共有3个答案

甄阿苏
2023-03-14

这就是我如何处理卷:

services:
  my-db-app:
    command: /shell_scripts/go.sh
    volumes:
      - ./shell_scripts:/shell_scripts 
潘向明
2023-03-14

如果您不能使用卷(想要无状态docker-compose.yml并使用远程机器),您可以通过命令编写配置文件。

官方图片中的nginx配置示例:

version: "3.7"

services:
  nginx:
    image: nginx:alpine
    ports:
      - 80:80
    environment:
      NGINX_CONFIG: |
        server {
          server_name "~^www\.(.*)$$" ;
          return 301 $$scheme://$$1$$request_uri ;
        }
        server {
          server_name example.com
          ...
        }
    command:
      /bin/sh -c "echo \"$$NGINX_CONFIG\" > /etc/nginx/conf.d/redir.conf; nginx -g \"daemon off;\""

环境变量也可以保存在. env文件中,您可以使用Compose的扩展功能或从shell环境中加载它(您从enyplace获取它):

https://docs.docker.com/compose/compose-file/#env_filehttps://docs.docker.com/compose/compose-file/#variable-substitution

要获取容器的原始entrypoint命令:

docker container inspect [container] | jq --raw-output .[0].Config.Cmd

要调查修改哪个文件通常有效:

docker exec --interactive --tty [container] sh
暨嘉
2023-03-14

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

此选项是通过使用docker-compose构建映像来实现的,该构建会将构建目录中的任何文件发送到远程docker引擎。您的docker-compose.yml如下所示:

version: '2'

services:
  my-db-app:
    build: db/.
    image: custom-db

db/Dockerfile看起来像:

FROM mysql:latest
COPY ./sql /sql

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

选项B:使用卷来存储您的数据。这不能直接在docker-compose内部完成。但是,将映像外部的文件包含到容器中是首选方式。您可以使用docker CLI和输入重定向以及tar等命令来填充网络上的卷,以打包和解压通过标准输入发送的文件:

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

通过脚本运行它,然后让相同的脚本跳出db容器以重新加载该配置。

选项C:使用某种网络连接的文件系统。如果可以在运行docker CLI的主机上配置NFS,则可以使用以下选项之一从远程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:使用群模式,您可以将文件作为配置包含在映像中。这允许配置文件(通常需要推送到群中的任何节点)按需发送到运行服务的节点。这使用docker-compose.yml文件来定义它,但群模式本身不使用docker-compose,因此这可能不适合您的特定要求。您可以运行单个节点群模式集群,因此即使您只有单个节点,此选项也可用。此选项确实需要将每个sql文件添加为单独的配置。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堆栈部署-c docker compose,而不是运行docker compose。yml my db堆栈。

 类似资料:
  • 我必须将一个在几个容器中运行的应用程序交付给一个客户。我可以用 我的目标是交付一个只有docker-compose.yml和图像(app1.tar,app2.tar...)的zip文件夹需要运行集装箱。

  • 我有一个,其中我将现有目录(包含内容)复制到工作正常的容器: Dockerfile 但当我使用文件中只有目录,而在中没有任何内容。 docker-compose.yml: 也许我不明白的功能,如果是这种情况,请告诉我如何通过文件将现有文件复制到容器。

  • 我正在使用iText生成Pdf。但当我试图在pdf中添加图像时, 我mage.get实例(新的URL(timetableResource.getImageUrl()));document.add(学校标志); 但我得到的错误是 HTTP状态500-服务器为URL返回了HTTP响应代码400:http://139.59.72.150:8080/sms/attachments/23/42/school

  • 我想通过docker compose构建图像,并为其设置特定标记。文件说: Comment将构建并用生成的名称标记它,然后使用该映像。 但是我找不到指定标签的方法,对于构建的图像,我总是看到“最新”标签。

  • 问题内容: 我对docker很陌生,并且正在遵循此处找到的文档,尝试使用docker- compose 1.14.0在dind内部署几个容器,我得到了以下内容 我错过了什么? 问题答案: 在执行docker run之前,将docker-compose安装添加到您的Dockerfile中。 例如,如果您有一个Ubuntu码头工人,则将其添加到您的 Dockerfile中 : 因为看起来好像您的入口点

  • 问题内容: 我的构建服务器上正在运行单元测试,并且想在发生故障时捕获日志结果以进行分析。我还没有找到一种将输出重定向到文件或找到日志文件实际所在位置的方法。 我想要的是: 编辑-澄清: 我所有的Docker容器都会生成有用的日志,这些日志会手动显示。我想编写脚本以将那些相同的日志保存到构建服务器上的工件文件中。本质上,保存到文件的输出不会退出。 问题答案: 默认情况下,docker使用驱动程序记录