为什么容器内容会因我是 `docker 运行 ...` 或 `docker-compose 运行 ...` 而有所不同?
Why are there differences in container contents depending on whether I `docker run ...`or `docker-compose run ...`?
根据我是通过 docker run -i -t <container> bash
还是 docker-compose run <container> bash
打开 bash shell 而我没有 know/understand 这怎么可能。
为了帮助解释,请查看我终端的 this 屏幕截图。在这两种情况下,我都在 运行 中创建名为 blaze
的图像,该图像是根据我的代码中的 Dockerfile
构建的。构建过程中的一个步骤是创建一个名为 venv
的 virutalenv,但是当我通过 docker-compose
打开一个 bash shell 时,这个 virtualenv 似乎并不存在我运行docker run ...
.
我对使用 Docker 设置自己的构建比较陌生,但如果它们都引用相同的图像,那么 ls
的输出肯定在 bash shell应该是一样的吧?我将非常感谢对资源的任何帮助或指导,这些资源可以解释这里到底出了什么问题...
另外一点,运行ning 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
这里有两个交叉点:
当您使用 Compose volumes:
或 docker run -v
选项在容器目录上安装主机内容时,主机内容将完全替换映像中的内容。如果主机上没有 ./venv
目录,那么容器中就不会有 /opt/app/venv
目录。这就是为什么当你 docker-compose run blaze ...
时,虚拟环境丢失了。
如果您 docker run
一个容器,唯一考虑的选项是特定 docker run
命令中的选项。 docker run
不知道 docker-compose.yml
文件,也不会从那里获取选项。这意味着在 docker run
情况下没有此卷安装,这就是虚拟环境重新出现的原因。
通常在 Docker 中你根本不需要虚拟环境:Docker 图像与其他图像和 Python 安装隔离,因此它是安全和正常的将您的应用程序安装到“系统”Python。您通常还希望您的图像是独立的,而不依赖于来自主机的内容,因此您通常不需要您显示的绑定安装。
这会将您的 Docker 文件简化为:
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 run
或 docker-compose run
(或 docker-compose up
)一致地工作。
根据我是通过 docker run -i -t <container> bash
还是 docker-compose run <container> bash
打开 bash shell 而我没有 know/understand 这怎么可能。
为了帮助解释,请查看我终端的 this 屏幕截图。在这两种情况下,我都在 运行 中创建名为 blaze
的图像,该图像是根据我的代码中的 Dockerfile
构建的。构建过程中的一个步骤是创建一个名为 venv
的 virutalenv,但是当我通过 docker-compose
打开一个 bash shell 时,这个 virtualenv 似乎并不存在我运行docker run ...
.
我对使用 Docker 设置自己的构建比较陌生,但如果它们都引用相同的图像,那么 ls
的输出肯定在 bash shell应该是一样的吧?我将非常感谢对资源的任何帮助或指导,这些资源可以解释这里到底出了什么问题...
另外一点,运行ning 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
这里有两个交叉点:
当您使用 Compose
volumes:
或docker run -v
选项在容器目录上安装主机内容时,主机内容将完全替换映像中的内容。如果主机上没有./venv
目录,那么容器中就不会有/opt/app/venv
目录。这就是为什么当你docker-compose run blaze ...
时,虚拟环境丢失了。如果您
docker run
一个容器,唯一考虑的选项是特定docker run
命令中的选项。docker run
不知道docker-compose.yml
文件,也不会从那里获取选项。这意味着在docker run
情况下没有此卷安装,这就是虚拟环境重新出现的原因。
通常在 Docker 中你根本不需要虚拟环境:Docker 图像与其他图像和 Python 安装隔离,因此它是安全和正常的将您的应用程序安装到“系统”Python。您通常还希望您的图像是独立的,而不依赖于来自主机的内容,因此您通常不需要您显示的绑定安装。
这会将您的 Docker 文件简化为:
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 run
或 docker-compose run
(或 docker-compose up
)一致地工作。