我已经创建了Dockerfile
和docker-compose.yml
文件。我可以在构建并运行Django Web应用程序的Windows 10上运行docker-compose up
。然后,我可以成功浏览到127.0.0.1:7000
并使用我的Web应用程序。
我的问题是,一旦退出,如何在不运行docker-compose up
的情况下启动图像?
当我键入docker images
时,我看到两个图像:python
和my_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"
答案 0 :(得分:4)
在docker-compose.yml
文件中,您编写了build: .
,该文件在路径.
上使用Dockerfile并创建了一个名为my_web_app的映像。
您有2个映像,因为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
在容器内运行指定的命令。
- 或者您可以使用
docker exec -ti my_web_app
并添加要在> this之后运行的命令。
答案 1 :(得分:3)
如果您docker run my_web_app
,它会立即退出,因为Dockerfile中没有CMD
。
正如其他人回答的那样,您可以运行docker-compose up
重新运行容器。 docker-compose.yml
文件包含启动容器所需的许多设置。仅docker-compose
命令读取此文件;普通的docker run
不会。
如果要使用简单的docker run
命令运行此命令,则应该做几件事:
从command:
删除docker-compose.yml
行;在您的CMD
中添加相同的Dockerfile
行。这样一来,映像就具有可以运行的默认命令,而不必在每次运行命令时都指定它。
从volumes:
中删除docker-compose.yml
;您已经ADD
中的Dockerfile
应用程序了,所以您不想用来自主机的随机内容覆盖它。
这将为您提供一个更简单的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 creates a default
network for you,并且还需要重新创建容器。
答案 2 :(得分:2)
这就是您运行它的方式。 docker-compose up
答案 3 :(得分:1)
如果要使其在后台运行,请运行docker-compose up -d
。
答案 4 :(得分:1)
Dockerfile
生成图像,然后docker-compose
使用该图像来构建和运行服务。
如果您打算在不运行docker-compose
的情况下运行服务,则应在Dockerfile
本身中定义如何执行容器。结帐cmd
CMD ["python", "manage.py", "runserver"]
您可能应该将command
从docker-compose文件移动到Dockerfile,然后使用docker-compose
或docker build
重新构建映像。
一旦图像可用,只需使用:
> docker run <image_name> --detach