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

如何获取docker-compose以使用存储库中的最新映像

邢良才
2023-03-14
问题内容

我不知道自己在做什么错,但是如果docker-compose up不先从系统中完全删除旧容器,就无法从注册表中使用最新映像。即使docker-
compose pull已获取较新的映像,它似乎仍在使用先前启动的映像。

我研究了如何使docker-compose始终从新映像重新创建容器?这似乎与我的问题类似,但是那里提供的解决方案都不适合我,因为我正在寻找可以在生产服务器上使用的解决方案,因此我不想在启动它们之前先删除所有容器再次(可能丢失数据?)。我只想检测更改图像的新版本,将它们拉出,然后使用这些新图像重新启动服务。

为此,我创建了一个简单的测试项目,其中唯一的目标是在每个新版本中增加版本nr。如果浏览到创建的Nginx服务器,则会显示nr版本(这在本地可以正常工作)。

docker版本:1.11.2 docker-compose版本:1.7.1 OS:已使用docker-toolbox在CentOS 7和OS X
10.10上进行了测试

我的docker-compose.yml:

version: '2'
services:
  application:
    image: ourprivate.docker.reg:5000/ourcompany/buildchaintest:0.1.8-dev
    volumes:
      - /var/www/html
    tty: true

  nginx:
    build: nginx
    ports:
      - "80:80"
    volumes_from:
      - application
    volumes:
      - ./logs/nginx/:/var/log/nginx
  php:
    container_name: buildchaintest_php_1
    build: php-fpm
    expose:
      - "9000"
    volumes_from:
      - application
    volumes:
      - ./logs/php-fpm/:/var/www/logs

在我们的jenkins服务器上,我运行以下命令来构建和标记图像

cd $WORKSPACE && PROJECT_VERSION=$(cat VERSION)-dev
/usr/local/bin/docker-compose rm -f
/usr/local/bin/docker-compose build
docker tag ourprivate.docker.reg:5000/ourcompany/buildchaintest ourprivate.docker.reg:5000/ourcompany/buildchaintest:$PROJECT_VERSION
docker push ourprivate.docker.reg:5000/ourcompany/buildchaintest

由于每次构建完成且版本nr发生变化时,我都会在资源库中获得一个新的版本标签,因此这似乎可以实现预期的效果。

如果我现在跑步

docker-compose pull && docker-compose -f docker-compose.yml up -d

在我计算机上的文件夹中,其中的内容仅是docker-
compose.yml和构建nginx和php服务所需的Dockerfiles,我得到的输出不是注册表中标记的最新版本号或显示的内容在docker-
compose.yml(0.1.8)中,但是之前的版本是0.1.7。但是pull命令的输出将建议获取图像的新版本:

Pulling application (ourprivate.docker.reg:5000/ourcompany/buildchaintest:latest)...
latest: Pulling from ourcompany/buildchaintest
Digest: sha256:8f7a06203005ff932799fe89e7756cd21719cccb9099b7898af2399414bfe62a
Status: Downloaded newer image for docker.locotech.fi:5000/locotech/buildchaintest:0.1.8-dev

只有我跑步

docker-compose stop && docker-compose rm -f

然后运行docker-compose up命令以获取新版本以按预期方式显示在屏幕上。

这是docker-compose的预期行为吗?也就是说,即使在生产服务器上,我也应该始终docker-compose rm -fup再次运行之前执行一次吗?还是我在对这里的谷物做些什么,这就是为什么它不起作用的原因?

目标是让我们的构建过程构建并创建docker-
compose.yml中所需图像的标记版本,将其推送到我们的私有注册表中,然后进行“发布到生产步骤”以简单地复制docker-compose。yml到生产服务器,并运行,docker-compose pull && docker-compose -f docker-compose.yml up -d以使新映像开始在生产中使用。如果有人对此有提示,或者可以指向这种设置的最佳实践教程,也将不胜感激。


问题答案:

为了解决这个问题,似乎已经奏效的东西确实正在运行

docker-compose stop
docker-compose rm -f
docker-compose -f docker-compose.yml up -d

也就是说,在up再次运行之前,请先移除容器。

这样做时需要记住的一点是,如果只运行数据卷容器,则也会将其删除rm -f。为了防止这种情况,我明确指定要删除的每个容器:

docker-compose rm -f application nginx php

正如我在问题中说的那样,我不知道这是否是正确的过程。但这似乎适用于我们的用例,因此在找到更好的解决方案之前,我们将继续使用该解决方案。



 类似资料:
  • 我为此创建了一个简单的测试项目,其中唯一的目标是获得一个版本nr以在每个新构建中增加。如果我浏览到创建的nginx服务器,就会显示版本nr(这在本地按预期工作)。 docker版本:1.11.2 docker-compose版本:1.7.1操作系统:使用docker-toolbox在CentOS 7和OS X 10.10上进行了测试 My Docker-compose.yml: 在我计算机上的一个

  • 问题内容: 我正在使用docker-compose命令运行多个容器。问题是我的docker- compose必须从公共存储库中提取一些图像,并从私有存储库中提取一些图像。我打算做的是将所有必需的映像推送到私有存储库,但是如何使docker- compose从私有存储库中提取映像。 简而言之->当图像仅在那里可用时,如何指向私有存储库 问题答案: 使用命令。(官方文件) 输入您的凭据,然后,只有拥有

  • 问题内容: 我想使用JGit获取存储库中的最后提交元数据(按日​​期最小的提交)。 我知道我可以使用以下方式获取提交元数据 但是如何获取最新的提交哈希? 还有其他方法可以直接在存储库中按日期获取最小数据吗? 问题答案: 按所有分支中的最后提交日期进行比较。 可以更改为仅比较远程分支。或者… 可以省略流利的setter 以便从本地存储库读取。

  • 问题内容: 我想通过docker-compose建立映像并为其设置特定标签。文档说: Compose将使用生成的名称来构建并标记它,然后使用该图像。 但是我找不到指定标签的方法,对于生成的图像,我总是看到“最新”标签。 问题答案: 似乎文档/工具已更新,您现在可以将标记添加到脚本中。这对我来说是成功的。 例: https://docs.docker.com/compose/compose- fil

  • 我有一篇docker文章。yml,我有一个Postgres数据库,Grafana在上面运行以查询数据。 我用命令docker compose up启动这个compose,但是如果我不想丢失任何数据,我必须运行docker compose stop,而不是docker compose down。 我还阅读了,但“提交操作将不包括安装在容器内的卷中包含的任何数据”,所以我想它对我的需求没有用。 存储创

  • 问题内容: 我正在尝试运行一个容器,该容器将公开私有GitHub存储库上的软件包中的golang服务。 由于我与GCE合作,因此我的入门图片是google / debian:wheezy。 安装所有必需的依赖项和工具后,我正在运行 包裹是私人仓库。 我添加了GitHub SSH密钥以允许从私有存储库克隆到docker文件: 尽管如此,当go尝试克隆存储库时,我在go get流程中遇到了一个错误: