创建django和mysql应用的docker工程

以下列出按照常规操作时会踩的坑

  1. django2.2.x版本目前暂时不支持mysql8.x版本。(20191117)
  2. django的默认数据库为SQLite,要改为mysql需要修改<project>/<project>/sittings.py中的database数值。例如:
    DATABASE = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'django_test', #此处为数据库名称
    'USER': 'username', 该对数据库拥有访问权限的用户名称
    'PASSWORD': 'password',
    'HOST': 'mysql-test', 这里的值是该数据库的域名名称
    'PORT': '3306'
    }
    }
  3. mysql的docker运行指令示例:
    docker run --network="django_test" --rm -d -e MYSQL_ROOT_PASSWORD=my-secret -e MYSQL_DATABASE=django_test -e MYSQL_USER=username -e MYSQL_PASSWORD=password --publish 3307:3306 --name mysql-test --hostname mysql-test mysql:5.7

Dockerfile 安装conda之后激活环境

dockerfile应用conda环境可以应用已有的一个miniconda image. 在这里

https://hub.docker.com/r/continuumio/miniconda/

在Dockerfile中通过conda安装环境和创建环境后,需要激活该环境时,不能直接运行

RUN conda activate env_name

因为conda activate 是假设你已经在一个shell中了,而Dockerfile文件执行时不存在shell环境。参考这里

I see. Your line RUN conda activate webapp is failing because conda activate only gets hooked in as an interactive shell command when you're actually using a shell. The statement, even if executed correctly, would have no effect, as that state wouldn't be carried over to the next RUN instruction.

https://github.com/ContinuumIO/docker-images/issues/89#issuecomment-408500352

但是我们激活环境的目的一般是为了运行某个应用程序,那么其实我们可以运行conda run -n env_name app_name

来实现此目的。

Once release conda 4.6, you can make use of conda run in your Dockerfile CMD / ENTRYPOINT.

https://github.com/ContinuumIO/docker-images/issues/89#issuecomment-409808454

Dockerfile COPY and ADD

COPY和ADD命令功能作用类似,其最大的差异在于ADD指令可以拷贝url的文件到image上。不过这个功能可以同样通过RUN curl && tar -xvzf 之类的指令实现。ADD最合适的应用场景为image添加本地的压缩文件。

这篇文章建议,绝大多数情况,尽量使用COPY而不是ADD。因为COPY更加直观

https://nickjanetakis.com/blog/docker-tip-2-the-difference-between-copy-and-add-in-a-dockerile

Dockerfile RUN, CMD, and ENTRYPOINT

run, cmd, entrypoint的区别

https://goinbigdata.com/docker-run-vs-cmd-vs-entrypoint/

总体来说

RUN, 是用来建立新一层的image,主要用于安装依赖

ENTRYPOINT, 主要用来配置image的可执行环境,相比于CMD,ENTRYPOINT执行的命令不会因为docker run中命令行的参数而不被执行。如果entrypoint的指令格式为[executable param1 param2]形式,它可以接受CMD或者docker run提供的参数。

CMD, 是用来提供默认运行指令或参数的,它提供的指令会被docker run命令提供的指令覆盖