python - 为什么容器内容会因我是 `docker run ...` 还是 `docker-compose run ...` 而有所不同?
问题描述
docker run -i -t <container> bash
根据我是否通过或打开 bash shell,我遇到了容器内容的差异,docker-compose run <container> bash
我不知道/理解这是怎么可能的。
为了帮助解释,请从我的终端查看此屏幕截图。在这两种情况下,我都在运行从我的代码中blaze
构建的名为的图像。构建过程中的步骤Dockerfile
之一是创建一个名为.venv
docker-compose
docker run ...
我对使用 Docker 设置自己的构建相对较新,但是如果它们都引用相同的图像,那么ls
bash shell 中的输出应该是相同的吗?我将不胜感激对资源的任何帮助或指导,以解释这里到底出了什么问题......
另外一点,运行 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 中是安全且正常的。您通常还希望您的图像是独立的,并且不依赖于主机的内容,因此您通常不需要显示的绑定挂载。
这会将您的 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 run
或docker-compose run
(或docker-compose up
)一致地工作。
推荐阅读
- linux - Need understand "ulimit"'s nofile setting in host and container
- java - 随机浮点值重复
- java - Java - 如何为多个线程同步运行函数
- python - 动态传递列名以及python mysql查询中的值
- elasticsearch - 动态模板支持默认类型?
- java - 当字符被屏蔽时,jtextarea 会暂时显示字符,这不应该
- bash - bash如何将多行链接到命令?
- javascript - JS通过2箭头函数this.push()
- php - 致命错误:未捕获的错误:调用 MobileShopee\Mobile Shopee\Templet\_cart-templet.php:78 中的数组上的成员函数 getSum() 堆栈跟踪:#0
- amazon-web-services - API Gateway:配置 API 映射时出错