如何在加载 Docker 容器后运行它而不使用 docker-compose up 命令?

3

我已经创建了一个 Dockerfiledocker-compose.yml 文件。我可以在 Windows 10 上运行 docker-compose up 命令来构建并运行我的 Django Web 应用程序。然后,我可以成功地浏览到 127.0.0.1:7000 并使用我的 Web 应用程序。

我的问题是,一旦我退出,如何启动我的镜像而不必再次运行 docker-compose up 呢?

当我输入 docker images 命令时,我看到两个镜像: pythonmy_web_app。我已经尝试过

docker run --publish 7000:8000 -- detach my_web_app

但它会立即退出。

我的Dockerfile

FROM python:3.6
ENV PYTHONUNBUFFERED 1
COPY ./requirements.txt /requirements.txt
RUN pip install -r /requirements.txt
RUN mkdir /code
WORKDIR /code
ADD . /code/
RUN useradd user
USER user

我的docker-compose.yml文件

version: "3"

services:
  web:
      build: .
      command: python manage.py runserver 0.0.0.0:8000
      volumes:
        - .:/code
      ports:
        - "7000:8000"
5个回答

5
docker-compose.yml文件中,你写了build: .,这个命令会使用路径为.的Dockerfile创建一个名为my_web_app的镜像。
由于Dockerfile中使用了Python作为基础镜像,因此Docker首先会拉取该镜像。另外一个镜像则是结果镜像(其中包含Python)。
现在,当你运行这条命令时:
docker run --publish 7000:8000 -- detach my_web_app

它创建了一个容器,但会立即退出,因为没有命令/进程需要运行。

docker-compose.yml文件中,存在一个 command: python manage.py runserver 0.0.0.0:8000 指令,在容器内运行此指令。

运行新容器的两种简单方法:

  • docker run --publish 7000:8000 -- detach my_web_app python manage.py runserver 0.0.0.0:8000
    

which runs the specified command inside the container.

  • Or you can use docker exec -ti my_web_app and add the command to run after >this.

4
如果你运行docker run my_web_app,由于Dockerfile中没有CMD,它会立即退出。
正如其他人解答的那样,你可以运行docker-compose up来重新运行容器。 docker-compose.yml文件包含启动容器所需的许多设置。只有docker-compose命令才会读取此文件;普通的docker run不会。
如果你想使用普通的docker run命令运行此命令,应该做以下几件事:
  • docker-compose.yml中删除command:行; 将相同的CMD行添加到Dockerfile。这将使镜像具有默认的命令,而无需每次运行命令时指定它。

  • docker-compose.yml中删除volumes:;在Dockerfile中已经ADD了应用程序,因此您不希望使用主机的随机内容覆盖它。

这将使你拥有一个更简单的docker-compose.yml文件。
version: "3"
services:
  web:
      build: .
      image: my_web_app  # (override the name Compose picks)
      ports:
        - "7000:8000"

一旦您拥有这个,您就可以将其转换为docker run命令。

docker run \
  -d \
  -p 7000:8000 \   # ports:
  my_web_app       # image:

如果你有其他选项(例如:environment:volumes:等),则需要将其转换为docker run选项。如果需要在容器之间通信,Compose会为您创建一个默认网络,您也需要重新创建此网络。

运行 docker build . 后,再运行 docker images,我看到刚刚构建的镜像的 repo 和 tag 都是 <none>。如何从 Dockerfile 中正确命名它? - Phil O
不是在Dockerfile中,你需要一个docker build -t选项。 - David Maze

2

这就是运行它的方式。 docker-compose up


1
如果你想让它在后台运行,请运行docker-compose up -d

1

Dockerfile 生成镜像,然后由 docker-compose 构建并运行服务。

如果您打算在不运行 docker-compose 的情况下运行服务,则应该在 Dockerfile 中定义如何执行容器。请查看 cmd

CMD ["python", "manage.py", "runserver"]

您应该将 command 从 docker-compose 文件移动到 Dockerfile,并再次使用 docker-composedocker build 构建镜像。

一旦镜像可用,只需使用以下命令运行:

> docker run <image_name> --detach


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接