0

1. 运行导出的镜像报错:docker: Error response from daemon: No command specified.

上传了web到NGINX,通过 docker export -o mynginx.tar [contianer id]构建出container文件,将文件拷贝到另一台装有docker的机器,运行docker import mynginx.tar 得到
docker import
repository跟tag字段都是没有数据的,原来docker import 也有额外的参数
有值啦
但是通过该镜像启动容器又报错了
docker: Error response from daemon: No command specified.

docker run

查阅资料知道,运行导入的镜像必须带上command参数。但是通过docker ps查看是省略号
看到的是省略号
换个命令docker ps --no-trunc查看完整的命令,最后运行该镜像的容器带上command参数,成功运行
docker run

2. 执行docker load -i nuxt.tar后 repository tag 都为none

image.png

我以为load跟import一样可以有额外的参数,于是乎docker load -i nuxt.tar nuxt,然后

image.png

需要在docker save的时候加上参数docker save -o nuxt.tar nuxt:1.0.0冒号后面的tag版本必须是存在的,不然也没法正确执行。如果需要改镜像名称跟版本号可以使用docker tag [镜像id] [新镜像名称]:[新镜像标签]

3. volume设置后对应的宿主机目录删除,则需要重新关联

比如
docker-compose.yaml

version: "3.8"
services:
 cloud:
 image: cloud:latest
 volumes:
 - /data/dist:/app/web

然后我将宿主机中的dist目录删掉,重新建个dist目录,这个时候容器是读不到该目录的,遇到这种情况怎么办?

  • 不删除宿主机的dist目录,而是替换里面的内容
  • 停掉该容器,重新运行 docker-compose up -d

4. 多个docker-compose.yml 共享网络 实现通信

我有两个站点,都是前后端分离的项目,为了使两个站点使用同一个mariadb,需要两个不同的docker-compose中的容器通信

  • 站点a
    docker-compose.yaml

    version: "3"
    networks:
    aa-web:
     driver: bridge
    services:
    mariadb:
     image: mariadb
     ports:
     - 3306:3306
     restart: always
     container_name: mariadb
     environment:
     MYSQL_ROOT_PASSWORD: 123456
     MYSQL_DATABASE: testDB
     MYSQL_USER: ee
     MYSQL_PASSWORD: 123456
     volumes:
     - ./db/initdb.d:/docker-entrypoint-initdb.d
     networks:
     - aa-web
    front-rest:
     build: ../aa-fe-rest
     container_name: front-rest
     restart: always
     ports:
     - 3465:3465
     depends_on:
     - mariadb
     networks:
     - aa-web
    front-nuxt:
     build: ../aa-nuxt
     restart: always
     ports:
     - 8643:8643
     depends_on:
     - front-rest
     networks:
     - aa-web
    nginx-web:
     build: ../nginx-web
     restart: always
     ports:
     - 80:80
     - 443:443
     depends_on:
     - front-nuxt
     networks:
     - aa-web
  • 站点b
    docker-compose.yaml

    version: "3"
    services:
    bb-front-rest:
     build: ../bb-fe-rest
     container_name: bb-front-rest
     restart: always
     ports:
     - 8536:8536
     networks:
     - docker-compose-bb_bb-web
     external_links:
     - mariadb
    bb-front-nuxt:
     build: ../bb-nuxt-first
     container_name: bb-front-nuxt
     restart: always
     ports:
     - 2683:2683
     depends_on:
     - bb-front-rest
     networks:
     - docker-compose-bb_bb-web
     external_links:
     - mariadb
    networks:
    docker-compose-bb_bb-web:
     external: true

    在站点a中建立了网络aa-web 然后在站点b中配置网络

    networks:
    docker-compose-bb_bb-web:
     external: true

    docker-compose-bb_bb-web这个名字可以根据docker network ls 命令或者docker network inspect docker-compose-bb_bb-web 查看具体哪些容器在使用。这样我们就可以在b站点使用同一个mariadb了。容器之间通信可以直接用容器名,而不是ip地址。

5. Dockerfile RUN npm install yarn -g 报错

FROM node:14 as builder
WORKDIR /home/geek
COPY package*.json ./
COPY yarn.lock ./
RUN npm install yarn -g
RUN yarn
RUN yarn build

解决办法:
直接删除RUN npm install yarn -g node的docker镜像安装了yarn

EEXIST: file already exists for installing npm package globally in Dockerfile

5. 将本地镜像推送到私有仓库

  • 注册私有仓库地址

    /etc/docker/daemon.json
    {
     "insecure-registries": ["192.81.236.87:8765"]
    }

    如果私有仓库设置里密码,则需要登录docker login 192.81.236.87:8765分别输入用户名密码,登录成功后,后面推送镜像就不需要输入用户名密码了;如果没设置密码则不需要登录。

  • 构建本地镜像

    docker build -t geek:0.0.1 .
  • 对本地镜像打tag

    docker tag geek:0.0.1 192.81.236.87:8765/geek:0.0.1
  • 将镜像推送到私有仓库

    docker push 192.81.236.87:8765/geek:0.0.1

    6. docker compose 重新创建容器

[画像:image.png]

有四个容器,ragflow-server被我玩坏了,我想给予image重新创建该容器。

docker-compose down service_name
docker-compose up -d service_name

kimi 给出的回答:

在使用 Docker Compose 时,如果你需要重新创建容器,通常有几种方法可以实现:

  1. 使用 docker-compose up 命令:
    如果你只是想启动服务,可以使用 docker-compose up 命令。如果容器已经存在,Docker Compose 会尝试重启它们。

    docker-compose up
  2. 使用 docker-compose up -d 命令:
    如果你的服务需要在后台运行,可以加上 -d 参数来启动服务。

    docker-compose up -d
  3. 使用 docker-compose down 命令:
    如果你需要完全停止并移除服务中的所有容器,可以使用 docker-compose down 命令。之后,你可以再次使用 docker-compose up 来重新创建和启动容器。

    docker-compose down
    docker-compose up
  4. 使用 docker-compose downdocker-compose up 重新创建特定服务:
    如果你只想重新创建特定的服务而不是整个应用,可以指定服务名称。

    docker-compose down service_name
    docker-compose up -d service_name
  5. 使用 docker-compose restart 命令:
    如果你需要重启所有服务中的容器,可以使用 docker-compose restart 命令。

    docker-compose restart
  6. 使用 docker-compose build 命令:
    如果你对 Dockerfiledocker-compose.yml 文件做了更改,并且需要重新构建镜像,可以使用 docker-compose build 命令。之后,使用 docker-compose up 来重新创建容器。

    docker-compose build
    docker-compose up
  7. 使用 docker-compose up --force-recreate 命令:
    如果你需要强制重新创建所有服务中的容器,即使它们的配置和镜像没有改变,可以使用 --force-recreate 标志。

    docker-compose up --force-recreate

请根据你的具体需求选择合适的命令。如果你只是想重新创建容器而不需要重新构建镜像,通常使用 docker-compose downdocker-compose up 就足够了。如果你做了代码更改或更新了配置,可能需要先使用 docker-compose build 来重新构建镜像。

7. docker 分阶段构建文件是相互隔离的

比如ragflow,Dockerfile

# base stage
FROM ubuntu:22.04 AS base
USER root
SHELL ["/bin/bash", "-c"]
WORKDIR /ragflow
# builder stage
FROM base AS builder
USER root
WORKDIR /ragflow
COPY web web
COPY docs docs
RUN --mount=type=cache,id=ragflow_npm,target=/root/.npm,sharing=locked \
 cd web && npm install && npm run build
# production stage
FROM base AS production
USER root
WORKDIR /ragflow
ENV PYTHONPATH=/ragflow/
COPY web web
# Copy compiled web pages
COPY --from=builder /ragflow/web/dist /ragflow/web/dist
ENTRYPOINT ["./entrypoint.sh"]

在builder阶段npm install 会产生node_modules,但是在最后的镜像或者容器中并没有该目录,因为每个阶段的文件是隔离的。

8. 实时查看运行的后端服务日志

docker logs -f ragflow-server


assassin_cike
1.3k 声望75 粉丝

生活不是得过且过


« 上一篇
webpack 相关
下一篇 »
styled-components

引用和评论

0 条评论
评论支持部分 Markdown 语法:**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用 @ 来通知其他用户。

AltStyle によって変換されたページ (->オリジナル) /