【问题标题】:Use a docker image to build a different docker image using a dockerfile使用 docker 镜像使用 dockerfile 构建不同的 docker 镜像
【发布时间】:2020-03-15 23:29:25
【问题描述】:

我正在尝试使用 docker 文件构建烧瓶应用程序的 docker 映像。烧瓶应用程序使用特定 sql 版本 datajoint/mysql 的 docker 映像(使用 docker-compose)。但我收到以下错误:

/bin/sh: 1: docker: not found
The command '/bin/sh -c docker run -v /var/run/docker.sock:/var/run/docker.sock ...' returned a non-zero code: 127

我还复制了 docker 和 docker-compose 到我的 app/ 目录。请你能帮我如何安装 docker 映像并从 docker 文件中调用 docker。我已经经历了以下link,但它并没有直接解决我的问题

Dockerfile

# this is an official Python runtime, used as the parent image
FROM python:3.6.5-slim

# set the working directory in the container to /app
WORKDIR /app



# add the current directory to the container as /app
ADD . /app
# execute everyone's favorite pip command, pip install -r
RUN docker run -v /var/run/docker.sock:/var/run/docker.sock ...
RUN ./docker-compose up -d
RUN ./docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=simple datajoint/mysql

# add the current directory to the container as /app
ADD . /app


# execute everyone's favorite pip command, pip install -r
RUN pip install --trusted-host pypi.python.org -r requirements.txt
ADD /datajoint-python /datajoint-python
RUN pip install -e ../datajoint-python/
# unblock port 80 for the Flask app to run on
EXPOSE 1234

# execute the Flask app
CMD ["python", "run.py"]

下面是amy应用目录的样子

非常感谢任何帮助。

【问题讨论】:

  • 您根本无法在 Dockerfile 中运行 docker 命令,无论如何,该映像基本上只包含一个文件系统并且不保留任何正在运行的进程。您是否正在寻找可以同时启动您的应用程序和数据库的 Docker Compose 设置?
  • 没有 docker,我使用 docker run 启动我的 sql。该应用程序使用调用数据库。当我运行整个应用程序 + db 打包的东西的 docker 映像时,我现在想要同样的东西。那么我应该使用 docker compose 来做吗?
  • 是的,Docker Compose 是一个用于同时运行多个容器的标准工具。

标签: docker flask docker-compose dockerfile datajoint


【解决方案1】:

@DavidMaze 是正确的,docker-compose 很可能是在您的主机上并排运行多个 docker 容器的最干净的方式。一旦您习惯了它的声明,它实际上是记录本地/原型设置的好方法。

查看heredatajoint/mysql 图像提供的参考docker-compose。特别是在您共享的设置中,您希望将 datajoint-python docker 化,如果您的 Dockerfile 与您的 docker-compose.yml 位于同一目录中,您可以像这样简单地实现它:

version: '2.4'
services:
  db:
    image: datajoint/mysql:5.7
    environment:
    - MYSQL_ROOT_PASSWORD=simple
    networks:
    - main
    #ports:
    #  - "3306:3306"
    #volumes:
    #  - ./data:/var/lib/mysql
  dj:
    build: .
    depends_on:
      db:
        condition: service_healthy
    environment:
    - DJ_HOST=db
    - DJ_USER=root
    - DJ_PASS=simple
    networks:
    - main
networks:
  main:

注意:我有意使用 2.X docker-compose 版本的唯一原因是 3.X 版本适用于不需要像这样的细粒度检查的 Docker Swarm 部署。

【讨论】:

    最近更新 更多