1

我有一个运行 continuum/miniconda3 映像的 Docker 容器,其中一个 Django 项目成功地服务于 localhost:8000,我可以看到我的项目在浏览器中运行。容器使用以下 Dockerfile 构建

FROM continuumio/miniconda3
ENV PYTHONUNBUFFERED 1
RUN mkdir /pft
WORKDIR /pft
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
RUN apt-get update && apt-get install -y && \
apt-get install build-essential libssl-dev -y && \
rm -rf /var/lib/apt/lists/*
RUN conda create --name pft python=3
RUN source activate pft
RUN pip install 'django==1.10.5'

但是,当我尝试在正在运行的终端中使用以下命令运行“conda”命令时:

docker exec -it my_running_container /bin/bash

我收到此错误消息:

root@ad9621c5e9bd:/pft# conda
bash: conda: command not found

还有什么令人困惑的是,在 Dockerfile 中使用的官方图像可以在这里找到https://hub.docker.com/r/continuumio/miniconda3/~/dockerfile/

使用以下命令构建映像,我没有看到 /etc/profile.d/conda.sh 或 /opt/conda。

RUN echo 'export PATH=/opt/conda/bin:$PATH' > /etc/profile.d/conda.sh && \
wget --quiet https://repo.continuum.io/miniconda/Miniconda3-4.3.14-Linux-x86_64.sh -O ~/miniconda.sh && \
/bin/bash ~/miniconda.sh -b -p /opt/conda && \
rm ~/miniconda.sh

我确信我正在为一个附加到正确的容器,因为我可以看到容器中已安装的卷,而对于两个我可以看到当我使用时只有一个正在运行的容器:

docker container ls -a

更新:

我正在使用一个 docker-compose.yml 文件,它从 Dockerfile 构建容器。我不一定相信 compose 创建的容器就是我想的那样。当我使用:

docker-compose up

它说:

creating some_container
Attaching to some_container

这是我要附加的服务。我正在尝试附加:

docker-compose exec -it web bash

以下是我的 docker-compose.yml 文件。

 version: "3"
 services:

   web: 
     build: ./config/src
     command: python manage.py runserver 0.0.0.0:8000
     volumes: 
       - ./src:/pft
     ports:
       - "8000:8000"

如果我通过以下方式运行基于使用 Dockerfile 构建的映像的容器:

docker run -it some_docker_image

我尝试通过以下方式附加到它:

docker exec -it my_running_container /bin/bash

当我将命令更改为在 docker-compose 文件中运行时

command: python manage.py runserver 0.0.0.0:8000

至:

command: source activate pft && python manage.py runserver 0.0.0.0:8000

使用 docker-compose up 时出现以下错误。

ERROR: for web  Cannot start service web: oci runtime error: 
container_linux.go:247: starting container process caused "exec: \"source\": 
executable file not found in $PATH"

奇怪的是,如果我使用我的 Dockerfile 手动构建一个图像并“docker run”一个基于该图像的容器,它会按预期工作。当我查找 docker-compose 自动从 Dockerfile 创建的图像,并尝试从图像中“docker run”一个容器时,它给出了上面提到的错误。为什么此映像与使用手动“docker build”命令创建的映像不同?

4

1 回答 1

1

我发现了问题。当您使用 docker-compose up,并且您已经更改了 Dockerfile 中 docker-compose 文件用于构建服务和容器的任何内容时,您将需要使用:

docker-compose up --build 

因为 docker-compose 将使用之前构建的图像。之后,重新构建我现在能够附加到正在运行的容器的图像,并且一切都按预期工作。

于 2017-06-08T20:22:23.067 回答