背景:最近在自学docker容器知识,在跟着《Docker - 从入门到实践》进行 docker-compose 搭建django/postgreSQL 实例。在搭建过程中由于自己操作失误以及理解不到位导致在出现错误的时加大了排错难度。为了防止以后忘记因此记录在此。

如下直接贴出docker-compose项目环境:



# uname -r
3.10.0-957.el7.x86_64
# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)


docker-compose volumes指令路径映射问题_python扩展

项目目录结构:

compose_django_postgresql: docker-compose.yml 文件存放路径

django:原本django服务容器需挂载的路径

postgresql:原本 postgresql服务容器需挂载的路径

Dockerfile:构建 django 镜像的文件

requirements:django服务容器需安装的python扩展包

 

Dockerfile文件内容如下:



FROM python:2.7
ENV PYTHONUNBFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/


docker-compose.yml文件内容如下:



postgresql:
image: postgres

django:
build: ./django
volumes:
- django:/code
ports:
- "8000:8000"
links:
- postgresql
command: python manage.py runserver 0.0.0.0:8000


一直到这一步都很顺利,哼哼,然后开始跟着教材执行 docker-compose 命令



[root@TestDocker compose_django_postgresql]# docker-compose run django django-admin.py startproject mytest_dockerdjango 
Pulling postgresql (postgres:)...
latest: Pulling from library/postgres
...........
...........
Removing intermediate container 840872e8a932
Successfully built 1dd4f62b514e
Successfully tagged compose_django_postgresql_django:latest
WARNING: Image for service django was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.


启动无报错~~~

由于之前测试 docker-compose up 启动项目之后在 web 上访问出现 ip 允许问题

docker-compose volumes指令路径映射问题_django_02

我就想这既然把django目录挂载到了服务容器到 /code 目录,那我直接去django目录下修改是否是一样的,于是乎。。。。

docker-compose volumes指令路径映射问题_django_03

what~~~, 刚创建的django项目目录呢?为了解决这个疑问查询了资料也没搞清楚问题在哪儿(原谅初学小白,哈哈!),我还在服务器上使用 docker-compose 建立了一个 wordpress项目,完全无问题~~~,后来在一次重新运行 docker-compose run django 中出现了如下错误:



# docker-compose run django django-admin startproject mytest_dockerdjango 
Starting compose_django_postgresql_postgresql_1 ... done
CommandError: '/code/mytest_dockerdjango' already exists


我注意到了‘'/code/mytest_dockerdjango' already exists’,因此我想我在 docker-compose.yml volumes指定可能有问题, django目录可能不是相对于我所在当前目录,使用find命令搜索之后证实了这一点

docker-compose volumes指令路径映射问题_python_04

于是我开始修改了 docker-compose.yml文件、停掉清理之前挂载的卷重新创建镜像并且运行 docker-compose run django django-admin startproject XXX 



# cat docker-compose.yml

postgresql:

image: postgres

django:

build: ./django

volumes:

- ./django:/code

ports:

- "8000:8000"

links:

- postgresql

command: python manage.py runserver 0.0.0.0:8000

# docker-compose stop
# docker-compose down --volumes
# docker-compose build --no-cache
# docker-compose run django django-admin startproject mytest_dockerdjango


然后再查看django目录有django 项目文件了

docker-compose volumes指令路径映射问题_python_05