【问题标题】:docker run not working: no container created despite making container imagedocker run not working:尽管制作了容器映像,但没有创建容器
【发布时间】:2019-10-31 00:57:16
【问题描述】:

总结

尽管docker build 成功构建了容器镜像,docker run 似乎没有构建容器(但它也不会抛出错误)。

输入输出

1. docker 镜像创建成功..

$ docker build -t minitwitter:latest .
...
Successfully built da191988e0db
Successfully tagged minitwitter:latest
$ docker images
REPOSITORY    TAG         IMAGE ID        CREATED         SIZE
minitwitter   latest      da191988e0db    6 seconds ago   173MB
python        3.7-alpine  b11d2a09763f    9 days ago      98.8MB

2. ..和 docker run 完成没有错误..

$ docker run --name minitwitter -d -p 8000:5000 --rm minitwitter:latest
e8835f1b4c72c8e1a8736589c74d56ee2d12ec7bcfb4695531759fb1c2cf0e48

3. ..但是 docker 容器似乎不存在。

$ docker ps
CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES

导航到应用程序应该暴露的端口http://localhost:8000,返回连接错误ERR_CONNECTION_REFUSED

Docker 文件,boot.sh

我认为 Dockerfile 和 boot.sh 文件非常简单:

Dockerfile

FROM python:3.7-alpine

RUN adduser -D minitwitter

WORKDIR /home/minitwitter

COPY requirements.txt requirements.txt
RUN python -m venv env
RUN env/bin/pip install -r requirements.txt
RUN env/bin/pip install gunicorn

COPY app app
COPY migrations migrations
COPY minitwitter.py config.py boot.sh ./
RUN chmod a+x boot.sh

ENV FLASK_APP minitwitter.py

RUN chown -R minitwitter:minitwitter ./
USER minitwitter

EXPOSE 5000
ENTRYPOINT ["./boot.sh"]

boot.sh

# BOOTS A DOCKER CONTAINER
#!/bin/sh
source env/bin/activate
flask db upgrade
exec gunicorn -b :5000 --access-logfile - --error-logfile - minitwitter:app

【问题讨论】:

  • 您可能想尝试运行它docker run --interactive --tty .... 而不是分离以更轻松地查看日志和任何异常。或者,docker container ls --all 也应该显示退出的容器。然后你可以docker container logs [CONTAINER-ID] 看看发生了什么。
  • 通常我会在创建 virtualenv 之后 source /env/bin/activatebefore pip --requirements 等。你能不能把大部分 boot.sh 折叠到你的 Dockerfile 中并拥有ENTRYPOINT ["gunicorn","-b",":5000",....]
  • @DazWilkin docker container ls --all 没有显示容器。这向我表明,根本没有创建容器。你同意?考虑到这个额外的事实,你有什么建议?
  • 正确。似乎没有(正确)创建容器。
  • 嗯....尽管您也有 docker run ... --rm ... 删除已完成的容器。也放下它。

标签: python-3.x docker dockerfile containers boot


【解决方案1】:

将'shebang' -- #!/bin/sh -- 放在boot.sh shell 脚本的第一行

我是如何找到这个答案的:This blog post 指的是这个Stackoverflow post

问题:原脚本第一行有注释,第二行有shebang。

注意:“问题”的标题具有误导性:构建了一个 docker 容器。然而,容器是短暂的,并且鉴于我在docker run 命令中使用了-rm 选项,容器在2 秒内终止后被删除;这就是它没有出现在docker images -a 命令中的原因。

【讨论】:

    猜你喜欢
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多