【问题标题】:How to run commands from docker-compose.yml to start couchdb如何从 docker-compose.yml 运行命令来启动 couchdb
【发布时间】:2020-08-28 05:59:46
【问题描述】:

我有一个用 django 编写的 webapp,我需要连接到 couchdb 两者都在 docker 容器上运行。 django 会将数据存储在名为“test”的 couchdb 表中。所以我需要在沙发数据库中创建“测试”表。但我无法弄清楚如何实现这一点,因为没有好的材料可供参考。我已经尝试了下面的代码,但它抛出了以下错误,因为 couchdb 没有启动并运行。有没有办法使用 docker-compose.yml 或任何其他替代方法在 couchdb 中创建表。

我使用docker-compose up 来运行容器

docker-compose.yml

version: '3'
services:
  web:
    build: .
    command: python ./webapp/server.py
    volumes:
      - .:/code
      - ./webapp/static:/static

    networks:
      - couchserver_network
    depends_on:
      - couchserver

  couchserver:
    image: couchdb
    ports:
       - "5984:5984"
    command: curl -u rob:123456 -X PUT localhost:5984/_users && curl -u rob:123456 -X PUT localhost:5984/test
    environment:
      - COUCHDB_USER=rob
      - COUCHDB_PASSWORD=123456
    volumes:
        - ./dbdata:/opt/couchdb/data
    networks:
      - couchserver_network


networks:
  couchserver_network:
    driver: bridge

抛出错误:

 0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0curl: (7) Failed to connect to localhost port 5984: Connection refused

如果我删除错误下面的行“command: curl -u rob:123456 -X PUT localhost:5984/_users && curl -u rob:123456 -X PUT localhost:5984/test”被抛出:

couchserver_1  | {database_does_not_exist,[{mem3_shards,load_shards_from_db,"_users",[{file,"src/mem3_shards.erl"},{line,399}]},.... 

这是我的 Dockerfile:

FROM python:3.6-slim-buster
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/

非常感谢任何形式的帮助

还有一个查询: 以下几行是做什么的。我是 docker 新手,这是我第一次接触它

 volumes:
     - ./dbdata:/opt/couchdb/data

【问题讨论】:

  • 执行curl 命令时,DB 似乎没有启动。

标签: django docker couchdb


【解决方案1】:

撰写文件中使用的command 会覆盖启动数据库的 Dockerfile 中的 CMD。

首先要考虑的是覆盖 CMD 以启动 DBAND 执行 curl,但由于 DB 的初始化方式,这将不起作用。

更好的方法是使用一个辅助容器来对 DB 执行 curl 命令。

这是一个创建所需数据库的最小示例:

version: '3'
services:
  couchserver:
    image: couchdb
    ports:
      - "5984:5984"
    environment:
      - COUCHDB_USER=rob
      - COUCHDB_PASSWORD=123456
    volumes:
        - ./dbdata:/opt/couchdb/data
  initializer:
    image: curlimages/curl
    deploy:
      restart_policy:
        condition: on-failure
    depends_on:
      - couchserver
    command: ["sh","-c","sleep 15 && curl -u rob:123456 -X PUT couchserver:5984/_users &&  curl -u rob:123456 -X PUT couchserver:5984/test"]

【讨论】:

  • Anderson,initializer 与 couchdb 独立工作时效果很好,但是当它与 django app 一起添加时,执行和运行的顺序遵循 couchdb--->djangoapp--->initializer。所以django仍然无法连接。我尝试构建图像两次。在第一次尝试初始化程序创建表,但在第二次尝试失败
  • @Bharath,尝试在 django 服务失败时添加 restart_policy。我正在更新我的帖子以展示如何做到这一点。我将它添加到我的初始化程序中,您应该将它添加到您的 django 服务下。 on-failure 策略允许您在退出代码指示错误时告诉 Docker 重新启动容器,但如果退出代码指示成功则不会。这可能仅在 django 容器以 !=0 退出时才有效
  • @Anderson,试过了。仍然没有希望..这里是错误日志:github.com/Bharath369-hub/docker
  • @Bharath,第一个日志和最后一个日志之间有 4 分钟的差异,对吧?到那时,初始化程序应该已经创建了数据库,但日志显示“数据库不存在”。我很确定这有不同的原因。可能是 django 容器有问题。
  • @Anderson,在我添加网桥 btn couchdb 和 django 应用程序以及初始化程序后,它现在可以工作了。将此答案标记为已接受。顺便说一句,在命令中我如何从 .env 文件中获取用户名和密码? { 用户 } 会怎么做?
猜你喜欢
  • 2020-06-25
  • 2019-05-21
  • 2021-01-13
  • 2015-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
相关资源
最近更新 更多