ENTRYPOINT和CMD如何在基本图像和当前图像之间工作?

时间:2019-10-19 14:28:43

标签: docker docker-compose dockerfile

somedockerhub/backend-base具有ENTRYPOINT ["entrypoint.sh"]

其中entrypoint.sh是:

#!/bin/bash
. /appenv/bin/activate
exec $@

以下是docker-compose文件:

app:
  build: ../../
  dockerfile: docker/release/Dockerfile
  links:
    - dbc
  volumes_from:
    - webroot
  environment:
    DJANGO_SETTINGS_MODULE: todobackend.settings.release
    MYSQL_HOST: db
    MYSQL_USER: user1
    MYSQL_PASSWORD: passwd
  command:
    - uwsgi
    - "--socket /var/www/someapp/someapp.sock"
    - "--chmod-socket=666"
    - "--module someapp.wsgi"
    - "--master"
    - "--die-on-term"

其中docker/release/Dockerfile

FROM somedockerhub/backend-base:latest


# Copy application artifacts
COPY target /wheelhouse

# Install application
RUN . /appenv/bin/activate && \
    pip install --no-index -f /wheelhouse someapp
    rm -rf /wheelhouse

ENTRYPOINT ["echo"]

1)

对于app服务启动的容器

ENTRYPOINT ["entrypoint.sh"]是否在ENTRYPOINT ["echo"]之前执行?

2)

假设当前图像中没有入口点,当前图像是否执行基本图像入口点,然后  command指令启动uwsgi进程为pid 1?

1 个答案:

答案 0 :(得分:1)

  

对于由应用服务启动的容器

     

在ENTRYPOINT之前执行ENTRYPOINT [“ entrypoint.sh”]吗?   [“ echo”]?

否,ENTRYPOINT ["echo"]会覆盖基本图像的ENTRYPOINT ["entrypoint.sh"]

因此ENTRYPOINT ["echo"]将运行并收到:

command: - uwsgi - "--socket /var/www/someapp/someapp.sock" - "--chmod-socket=666" - "--module someapp.wsgi" - "--master" - "--die-on-term"

作为参数

  

假设当前图像中没有入口点,当前图像是否存在   执行基本映像入口点,然后启动命令指令   uwsgi进程是否为pid 1?

是的,entrypoint.sh将运行。它将接收command值作为参数。

entrypoint代码exec $@的意思是:执行所有脚本(enterypoint.sh)自变量(uwsgi...)

definition

exec不会生成新进程,而是将uwsgi加载到现有进程的内存中。由于exec进程是使用pid 1启动的,因此uwsgi将收到pid 1。