docker - 容器在使用 Dockerfile 时工作,但在使用 docker-compose.yml 时不工作
问题描述
我想做什么
我正在尝试使用 Docker Compose 创建开发环境。
我将创建以下容器:
- Python
- 阿帕奇
- mysql
我将首先着手让python容器工作。
我的问题
当我只使用一个Dockerfile
. 但是,当我使用docker-compose.yml
文件时,同一个容器会立即退出。我希望它继续运行。我究竟做错了什么?提前致谢。
app(develop) $ docker --version
Docker version 20.10.3, build 48d30b5
app(develop) $ docker-compose --version
docker-compose version 1.28.2, build 67630359
Dockerfile
我已经开始创建一个Dockerfile.python
# Set base image (host OS)
FROM python:3.9-slim-buster
# Run apt update and upgrade and install as necessary.
RUN apt update; \
apt upgrade -y --no-install-recommends; \
apt install python3-pip -y; \
apt autoremove -y; \
rm -vfr /var/lib/apt/lists/*
# Set the working directory in the container.
RUN mkdir -v /code
WORKDIR /code
# Command to run on container start
CMD ["/bin/bash"]
我能够成功构建容器。
app(develop) $ ls -laR
total 32
drwxrwxr-x 5 mike mike 4096 Feb 3 22:18 .
drwxrwxr-x 4 mike mike 4096 Feb 1 13:51 ..
-rw-rw-r-- 1 mike mike 3357 Feb 3 22:08 docker-compose.yml
-rw-rw-r-- 1 mike mike 3070 Feb 3 22:18 Dockerfile.python
drwxrwxr-x 8 mike mike 4096 Feb 3 21:04 .git
drwxrwxr-x 2 mike mike 4096 Jan 31 15:01 src
./src:
total 16
drwxrwxr-x 2 mike mike 4096 Jan 31 15:01 .
drwxrwxr-x 5 mike mike 4096 Feb 3 22:18 ..
-rw-rw-r-- 1 mike mike 178 Jan 31 15:01 script.py
app(develop) $ docker build --tag my/python:0.1 \
> --file Dockerfile.python \
> .
blah, blah, blah
Successfully tagged my/python:0.1
app(develop) $ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
my/python 0.1 9ad1a86c619c About a minute ago 510MB
python 3.9-slim-buster 677f7ac99e48 9 days ago 114MB
我能够成功创建并启动容器。
app(develop) $ docker run --name my-python \
> --mount 'type=bind,source=/home/mike/my-python-projects/app,destination=/code/' \
> --hostname=python-dev-cont \
> --interactive --tty --detach \
> my/python:0.1
3a29eaa6955dac3d1aaf6a27f80c2f6518fd788f2d0ed88a76797932842176ec
app(develop) $ docker container ls --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3a29eaa6955d my/python:0.1 "/bin/bash" 13 seconds ago Up 12 seconds my-python
app(develop) $ docker exec --interactive --tty my-python /bin/bash
root@python-dev-cont:
root@python-dev-cont:/code# python --version
Python 3.9.1
root@python-dev-cont:/code# pip3 --version
pip 21.0 from /usr/local/lib/python3.9/site-packages/pip (python 3.9)
root@python-dev-cont:/code# python src/script.py
Hello World from Python!!!
x is: 4
That's all folks!
root@python-dev-cont:/code# exit
exit
app(develop) $ docker container stop my-python
my-python
app(develop) $ docker container rm my-python
my-python
app(develop) $ docker container ls --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
到目前为止一切都很好。
码头工人-compose.yml
由于我将拥有上述其他容器,因此我将希望使用 Docker Compose 以便容器可以协同工作。
这是代码docker-compose.yml
version: "3.8"
# =============================================================================
# docker container create
# =============================================================================
services:
# -----------------------------------------------------------------------------
python:
# -----------------------------------------------------------------------------
container_name: "my-python"
build:
context: "."
dockerfile: "Dockerfile.python"
image: "my/python:0.1"
hostname: "python-dev-cont"
volumes:
- type: bind
source: .
target: /code/
当我使用以下命令时,容器被创建、启动,但随后立即退出。
app(develop) $ docker-compose up --build --detach
Building with native build. Learn about native build in Compose here: https://docs.docker.com/go/compose-native-build/
Building python
Sending build context to Docker daemon 80.9kB
Step 1/5 : FROM python:3.9-slim-buster
---> 677f7ac99e48
Step 2/5 : RUN apt update; apt upgrade -y --no-install-recommends; apt install python3-pip -y; apt autoremove -y; rm -vfr /var/lib/apt/lists/*
---> Using cache
---> 3be88973dbbc
Step 3/5 : RUN mkdir -v /code
---> Using cache
---> 91d715fef9d4
Step 4/5 : WORKDIR /code
---> Using cache
---> b746571615f7
Step 5/5 : CMD ["/bin/bash"]
---> Using cache
---> df09d2624564
Successfully built df09d2624564
Successfully tagged my/python:0.1
Creating my-python ... done
app(develop) $ docker container ls --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b2dbaffe179d my/python:0.1 "/bin/bash" 21 seconds ago Exited (0) 20 seconds ago my-python
我期望容器能够像我使用Dockerfile.python
. 我究竟做错了什么?我正在使用相同的 Dockerfile.python。
解决方案
那是因为您的图像定义为bash
在命令中运行,这需要交互模式。
您可以添加stdin_open
+tty
以防止容器终止,但您仍然必须这样exec
做才能获取命令行,因为 docker-compose 会流出日志。
version: "3.8"
# =============================================================================
# docker container create
# =============================================================================
services:
# -----------------------------------------------------------------------------
python:
# -----------------------------------------------------------------------------
container_name: "my-python"
build:
context: "."
dockerfile: "Dockerfile.python"
image: "my/python:0.1"
hostname: "python-dev-cont"
stdin_open: true
tty: true
volumes:
- type: bind
source: .
target: /code/
你也可以运行docker-compose run my-python
推荐阅读
- assembly - 执行 asm 程序后不要在 shell 中换行。[美国电话电报]
- angular - 使用角度为 8 的无类型传单会导致问题
- reactjs - 如何调用 React Hooks useEffect() 中定义的 onClick 函数?
- angular - 如何从asp.net核心下载带有角度的fileStream
- vue.js - Ionic 4,Ionicon 库添加自定义图标
- php - 如果我的环境是生产环境,如何查看视图?
- java - 注册匿名类功能
- typescript - v-on 监听器中的 Vue $emit 不起作用
- c# - 如何在 C# 中获取 DataGridView 中的主键?
- django - 来自 docker-compose 命令的行为与在 Dockerfile 中运行的行为不同