为什么容器内容会因我是`docker run ...`还是`docker-compose run ...`而有所不同?

时间:2021-06-21 16:31:30

标签: python bash docker docker-compose virtualenv

根据我是通过 docker run -i -t <container> bash 还是 docker-compose run <container> bash 打开 bash shell,我遇到了容器内容的差异,但我不知道/不明白这是怎么回事。

为了帮助解释,请查看我终端的 this 屏幕截图。在这两种情况下,我都在运行名为 blaze 的映像,它是从我的代码中的 Dockerfile 构建的。构建期间的步骤之一是创建一个名为 venv 的 virutalenv,但是当我通过 docker-compose 打开 bash shell 时,这个 virtualenv 似乎并不存在,与运行 docker run ... 时不同。

我对使用 Docker 设置自己的构建比较陌生,但是如果它们都引用相同的图像,那么 bash shell 中 ls 的输出应该是相同的吗?我将不胜感激任何对资源的帮助或指导,以解释这里究竟出了什么问题......

另外一点,运行 docker images 表明两个命令必须使用相同的图像...

提前致谢!

这是我的Dockerfile

FROM blaze-base-image:latest

# add an URL that PIP automatically searches (e.g., Azure Artifact Store URL)
ARG INDEX_URL
ENV PIP_EXTRA_INDEX_URL=$INDEX_URL

# Copy source code to docker image
RUN mkdir /opt/app
COPY . /opt/app
RUN ls /opt/app

# Install Blaze pip dependencies
WORKDIR /opt/app
RUN python3.7 -m venv /opt/app/venv
RUN /opt/app/venv/bin/python -m pip install --upgrade pip
RUN /opt/app/venv/bin/python -m pip install keyring artifacts-keyring
RUN touch /opt/app/venv/pip.conf
RUN echo $'[global]\nextra-index-url=https://www.index.com' > /opt/app/venv/pip.conf
RUN /opt/app/venv/bin/python -m pip install -r /opt/app/requirements.txt
RUN /opt/app/venv/bin/python -m spacy download en_core_web_sm

# Comment
CMD ["echo", "Container build complete"]

这是我的docker-compose.yml

version: '3'

services:
    blaze:
        build: .
        image: blaze
        volumes:
            - .:/opt/app

1 个答案:

答案 0 :(得分:6)

这里有两件相互交叉的事情:

  1. 当您使用 Compose volumes:docker run -v 选项将主机内容挂载到容器目录时,主机内容会完全替换图像中的内容。如果主机上没有 ./venv 目录,则容器中不会有 /opt/app/venv 目录。这就是为什么当您 docker-compose run blaze ... 时,缺少虚拟环境。

  2. 如果您 docker run 一个容器,则唯一考虑的选项是该特定 docker run 命令中的选项。 docker run 不知道 docker-compose.yml 文件,也不会从那里获取选项。这意味着在 docker run 情况下没有此卷装载,这就是虚拟环境重新出现的原因。

通常在 Docker 中,您根本不需要虚拟环境:Docker 映像与其他映像和 Python 安装隔离,因此将您的应用程序安装到“系统”Python 中是安全和正常的。您通常还希望您的图像是自包含的,而不依赖于来自主机的内容,因此您通常不需要显示的绑定安装。

这会将您的 Dockerfile 简化为:

FROM blaze-base-image:latest

# Any ARG will automatically appear as an environment variable to
# RUN directives; this won't be needed at run time
ARG PIP_EXTRA_INDEX_URL

# Creates the directory if it doesn't exist
WORKDIR /opt/app

# Install the Python-level dependencies
RUN pip install --upgrade pip
COPY requirements.txt .
RUN pip install -r requirements.txt
# The requirements.txt file should list every required package

# Install the rest of the application
COPY . .

# Set the main container command to run the application
CMD ["./app.py"]

docker-compose.yml 文件可以类似地简化为

version: '3.8' # '3' means '3.0'
services:
  blaze:
    build: .
    # Compose picks its own image name
    # Do not need volumes:, the image is self-contained

然后它将与 docker rundocker-compose run(或 docker-compose up)一致地工作。