Docker创建多个图像

时间:2018-03-02 03:24:12

标签: docker docker-compose dockerfile

我是Docker的新手,发现有很多图像正在创建(如sudo docker images中所示),并在stackoverflow中的某处找到,以定期运行sudo docker rmi $(sudo docker images -q)以删除所有图像。为什么要创建这么多图像?我的配置有问题吗?

搬运工-compose.yml

nginx:
  build: ./nginx
  restart: always
  ports:
    - "80:80"
    - "443:443"
  volumes:
    - /etc/letsencrypt/:/etc/letsencrypt/
  links:
    - node:node

node:
  build: ./node
  restart: always
  ports:
   - "8080:8080"
  volumes:
    - ./node:/usr/src/app
    - /usr/src/app/node_modules

nginx dockerfile是

FROM nginx:alpine

COPY nginx.conf /etc/nginx/conf.d/default.conf

nodejs dockerfile是

FROM node:9.3.0-alpine

WORKDIR /usr/src/app

COPY package*.json /usr/src/app/

RUN npm install --only=production

COPY . /usr/src/app

EXPOSE 8080
CMD [ "npm", "start" ]

网站/应用可以正常使用。除了定期,我将删除所有容器,图像,然后运行:sudo docker-compose up --build -d

3 个答案:

答案 0 :(得分:0)

不应该创建“这么多图像”。

如果你想确保只保留你需要的那个(不必每次都重建所有东西);只需(如I detail here):

    [HttpPost]
    [Route("~/api/trackAllInOne/set")]
    [Consumes("application/x-www-form-urlencoded")]
    public IActionResult Post([FromForm] string data)
    {
        PlayerPackage playerPackage = JsonConvert.DeserializeObject<PlayerPackage>(data);
        return Json(data);
    }

答案 1 :(得分:0)

图像是不可变的,因此您所做的任何更改都会导致创建新图像。由于compose文件指定了build命令,因此在启动容器时它将重新运行build命令。如果您使用COPYADD更改了任何文件,则不再使用现有的图像缓存,它将构建新图像而不删除旧图像。

注意,我建议在撰写文件中命名您的图像,以便清楚正在重建哪个图像。您可以将构建构建输出观察到第一步,即不使用缓存进行报告以查看正在发生的变化。如果我猜测,破坏缓存并导致新图像的行是nodejs中的这一行:

COPY . /usr/src/app

如果容器中不需要更改文件并导致重建,请使用.dockerignore文件排除不必要的文件。

答案 2 :(得分:0)

在构建Dockerfile时,我遇到了同样的问题。

我找到了解决方案,使用此命令来构建文件:

`docker build --rm -t <tag> .`

选项--rm在成功构建后会删除中间容器。