当前位置: 首页 > 面试题库 >

如何在Docker Compose中运行一次命令

淳于鹏
2023-03-14
问题内容

因此,我正在研究一个docker compose文件来部署Go Web服务器。我的服务器使用mongo,因此我在docker
compose中添加了数据量容器和mongo服务。然后,我编写了一个Dockerfile来构建我的Go项目,并最终运行它。

但是,还必须执行另一步骤。编译完项目后,我必须运行以下命令: ./my-project -setup

这将向数据库添加一些必要的信息,并且该信息 仅需要添加一次
。但是,我无法在构建过程中在Dockerfile上添加此步骤,因为mongo必须已经启动。

那么,我该如何实现呢?即使重新启动服务器然后再次运行,docker-compose up我也不想再次执行此命令。

我想我对Docker有一些了解,因为我实际上并不了解有关数据卷容器的所有信息(它们只是 停止
了装载卷的容器吗?)。另外,如果我重新启动服务器,然后运行docker-compose up,将运行哪些命令?它会只是启动与给定CMD现在停止的相同容器吗?

无论如何,这是我的docker-compose.yml:

version: '2'
services:
  mongodata:
    image: mongo:latest
    volumes:
      - /data/db
    command: --break-mongo
  mongo:
    image: mongo:latest
    volumes_from:
      - mongodata
    ports:
      - "28001:27017"
    command: --smallfiles --rest --auth
  my_project:
    build: .
    ports:
      - "6060:8080"
    depends_on:
      - mongo
      - mongodata
    links:
      - mongo

这是我的Dockerfile,用于构建我的项目映像:

FROM golang

ADD . /go/src/my_project
RUN cd /go/src/my_project && go get
RUN go install my_project
RUN my_project -setup
ENTRYPOINT /go/bin/my_project

EXPOSE 8080

问题答案:

我建议在您的容器中添加一个入口点脚本。在此entrypoint-script中,您可以检查数据库是否已初始化,如果尚未初始化,请执行所需的步骤。

正如您在问题中注意到的那样,不应理会服务/容器的启动顺序,因此有可能在数据库容器 之前 启动了应用程序容器,因此脚本应该考虑到这一点。

例如,看一下官方的WordPress图像,该图像在入口点脚本中执行数据库的一次性初始化。该脚本尝试连接到数据库(如果无法联系数据库,则重试),然后检查是否需要初始化。https://github.com/docker-
library/wordpress/blob/df190dc9c5752fd09317d836bd2bdcd09ee379a5/apache/docker-
entrypoint.sh#L146-L171

注意

我注意到您创建了一个“仅数据容器”来附加您的卷。从Docker 1.9开始,Docker具有卷管理功能,包括命名卷。因此,您不再需要使用“仅数据”容器。

您可以从撰写文件中删除仅数据容器,然后将mongo服务更改为如下所示;

  mongo:
    image: mongo:latest
    volumes:
      - mongodata:/data/db
    ports:
      - "28001:27017"
    command: --smallfiles --rest --auth

这应该创建一个新卷,mongodata如果它不存在则命名,或者重新使用具有该名称的现有卷。您可以列出所有使用docker volume ls的卷,docker volume rm <some-volume>如果不再需要它可以删除一个卷



 类似资料:
  • 问题内容: 我想运行一些命令,直到按Ctrl-C才会退出。是否可以运行一次即可运行所有这些程序,而Ctrl-C会全部退出它们?他们可以共享终端输出。 具体来说,我有罗盘编译器,coffeescript编译器和一个自定义命令,用于监视文件更改,所有命令都在运行以监视文件更改。我不想为每个命令加载一个终端。 问题答案: 该bash脚本适用于N个并行线程。每个参数都是一个命令。 捕获SIGINT时将杀死

  • 问题内容: 我想问一下如何多次执行1条命令 例如此代码 我要运行500次,该怎么办? 谢谢 问候威廉姆斯 问题答案: 使用循环, 请阅读基本的Java教程。可以在这里找到一个

  • 问题内容: 我想创建两个文件的差异。我尝试在Java中搜索可完成此操作的代码,但是没有找到任何简单的代码/实用程序代码。因此,我想如果我能以某种方式从我的Java代码中运行linux diff / sdiff命令并使它返回一个存储diff的文件,那就太好了。 假设有两个文件fileA和fileB。我应该能够通过我的Java代码将它们的差异存储在名为fileDiff的文件中。然后从fileDiff提

  • 我想知道是否可以在java spring boot中使用调度或spring作业只运行一次方法?我用温度变量作为开关,但我正在寻找更好更干净的方法。

  • 问题内容: 我有一个Java项目,可以在Eclipse上正常运行。现在,我需要使用命令行来运行它,例如java classpath …如何在Eclipse中基于存储的类路径来设置该类路径。 问题答案: 只需导航到类文件所在的目录并使用 编辑:您可以将替换为任何类路径。例如,要查找您的类路径,可以使用 编辑:看起来像有相当多的信息,可以帮助你在这里。

  • 问题内容: 我正在Ubuntu环境 (LAMP)* 上工作,但是当我在 Windows 7启动器 操作系统上安装 symfony2 时,当我尝试在Windows中使用命令提示符制作 实体时 ,它会遇到问题,但它不会使用 php app / console * 任何帮助表示赞赏! 谢谢 问题答案: 您需要将PHP可执行文件添加到PATH中,或使用绝对链接调用它:。