Docker Compose不允许使用本地图像

时间:2017-09-04 07:39:08

标签: docker docker-compose

以下命令失败,尝试从Docker Hub中提取图像:

from scipy.spatial import KDTree
def kd_near_fn(*args, dist = 2., outfile = "practicefilecreate.txt"):
    trees = [KDTree(arg) for arg in args]
    if len(trees) == 1:
        i, j = trees[0].query_pairs(dist)
        k = np.unique(np.r_[i, j])
    elif len(trees) == 2:
        queries = trees[0].query_ball_tree(trees[1], dist)
        k = np.array([len(query) > 0 for query in queries])
    else:
        assert False, "too many inputs"
    np.savetxt(args[0][k], outfile, delimiter = ',')

但我只是想使用图像的本地版本,它存在:

$ docker-compose up -d
Pulling web-server (web-server:staging)...
ERROR: repository web-server not found: does not exist or no pull access

为什么Docker不在本地存储的图像中搜索?

这是我的Docker Compose文件:

$ docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
web-server           staging             b94573990687        7 hours ago         365MB

和我的.env文件:

version: '3'
services:
  chat-server:
    image: chat-server:staging
    ports:
      - "8110:8110"
  web-server:
    image: web-server:staging
    ports:
      - "80:80"
      - "443:443"
      - "8009:8009"
      - "8443:8443"

9 个答案:

答案 0 :(得分:43)

一般来说,这应该像你描述的那样工作。试图重现它,但它只是工作...

文件夹结构:

function(marker){
    marker.on('mouseover', function(e) {
      this.openPopup();
      marker.setIcon(bigIcon);
    });
}(marker)

Dockerfile的内容:

import pandas as pd    
df1 = pd.DataFrame({"machine":["M1"]*4, "WeekNum": [2,5,8,10], "Percent":[75,80,95,90]})
df2 = pd.DataFrame({"machine":["M1"]*10,"WeekNum":np.arange(1,11,1),"Percent":[100]*10})
newcol = df2.merge(df1, on = "WeekNum", how = "outer")["Percent_y"].fillna(100)
df2["Percent"] = newcol

构建和标记图片:

.
├── docker-compose.yml
└── Dockerfile

使用docker-compose.yml:

FROM alpine
CMD ["echo", "i am groot"]

并启动docker-compose:

docker build -t groot .
docker tag groot:latest groot:staging

答案 1 :(得分:9)

在您的docker-compose.yml中,您可以为本地构建指定build: .而不是build: <username>/repo>(而不是从docker-hub中提取) - 我无法验证这一点,但是我相信你可以能够为docker-compose文件提供多种服务的相对路径。

services:
  app:
    build: .

参考:https://github.com/gvilarino/docker-workshop

答案 2 :(得分:6)

您可能需要更改图片代码,使两个部分用斜杠/分隔。而不是

chat-server:staging

做类似的事情:

victor-dombrovsky/chat-server:staging

我认为Docker标签背后有一些逻辑,“一部分”标签被解释为来自DockerHub的官方图像。

答案 3 :(得分:5)

版本> 1.23(2019年及更高版本)

最简单的方法是将image更改为build:并在相对目录中引用Dockerfile,如下所示:

version: '3.0'
services:
  custom_1:
    build:
      context: ./my_dir
      dockerfile: Dockerfile

这允许docker-compose在单个命令中管理整个构建和图像编排。

# Rebuild all images
docker-compose build
# Run system
docker-compose up

答案 4 :(得分:3)

在@Tom Saleeba的回复中,

用“ /”标记容器后,我仍然出现错误 (例如:victor-dombrovsky/docker-image:latest) 它一直在从远程docker.io服务器寻找图像。

registry_address/docker-image

似乎“ /”之前的URL是注册表地址,而“ /”之后的URL是映像名称。并且不提供“ /”,默认情况下docker-compose从远程docker.io查找该图像。

似乎是known bug,带有docker-compose

我终于在running the local registry下使它工作,使用注册表标记将其推送到本地注册表,然后从本地注册表中提取图像。

$ docker run -d -p 5000:5000 --restart=always --name registry registry:2
$ docker tag your-image-name:latest localhost:5000/your-image-name
$ docker push localhost:5000/your-image-name

,然后在dockerfile中更改图像网址:

version: '3'
services:
  chat-server:
    image: chat-server:staging
    ports:
      - "8110:8110"
  web-server:
    image: localhost:5000/your-image-name #####change here
    ports:
      - "80:80"
      - "443:443"
      - "8009:8009"
      - "8443:8443"

类似地,用于聊天服务器图像。

答案 5 :(得分:2)

对我来说,把“ build:。” 做到了。我正在工作的docker compose文件如下所示,

version: '3.0'
services:
  terraform:
    build: .
    image: tf:staging
    env_file: .env
    working_dir: /opt
    volumes:
      - ~/.aws:/.aws

答案 6 :(得分:1)

.env中有一个DOCKER_HOST条目

根据您的.env文件的外观,您似乎已将docker-compose配置为使用远程Docker主机:

DOCKER_HOST=tcp://***.***.**.**:2376

此外,此.env仅由docker-compose加载,而不由docker加载。因此,在这种情况下,您的docker images输出不会代表运行docker-compose时可用的图像。

运行docker-compose时,实际上是在远程主机tcp://***.***.**.**:2376上运行Docker,而单独运行docker时,则是在本地运行Docker。

运行docker images时,实际上的确看到了存储在本地计算机上的图像列表。但是docker-compose up -d将尝试启动容器,而不是在***.***.**.**:2376上启动容器。 docker images不会显示远程Docker主机上可用的映像,除非您设置DOCKER_HOST环境变量,例如:

DOCKER_HOST=tcp://***.***.**.**:2376 docker images

很显然,远程Docker主机上没有存储web-server:staging映像,该映像在Docker Hub上也不可用。这就是Docker抱怨找不到图像的原因。

解决方案

在本地运行容器

如果您打算在本地运行容器,则只需从.env中删除DOCKER_HOST=...行,然后重试。

将图像推送到存储库中。

但是,如果计划在给定的DOCKER_HOST上远程运行映像,则可能应该将其推送到存储库中。您可以在Docker Hub上创建一个免费的存储库,也可以在某个地方托管自己的存储库,然后使用docker push将映像推送到那里,然后确保docker-compose.yml引用了正确的存储库。

保存图像,远程加载。

如果您不想将映像推送到Docker Hub或托管自己的存储库,也可以使用docker image savedocker image load的组合来传输映像:

docker image save web-server:staging | DOCKER_HOST=tcp://***.***.**.**:2376 docker image load

请注意,对于大图像,这可能需要一段时间,尤其是在连接速度较慢的情况下。

答案 7 :(得分:0)

一个人也可以引用本地图像名称​​,而无需标签

docker build -t imagename .

可以称为:

version: "3"
services:
  web:
    image: imagename

在docker-compose yaml中。

答案 8 :(得分:0)

在我的测试中,要使其正常工作,您必须指定一个数字标签,否则docker将尝试远程检查最新版本。

将本地映像重命名为“ web-server:1”而不是“ web-server:staging”,然后相应地更改撰写文件。