rij*_*srk 2 shell provisioning docker docker-compose
我对 Docker 还很陌生,我正在尝试找到在容器启动后配置 Docker 的最佳方式。我们使用该docker-compose文件来构建容器,我们的撰写文件如下所示。
version: "3"
php:
image: wodby/drupal-php:$PHP_TAG
container_name: "${PROJECT_NAME}_php"
environment:
DB_HOST: $DB_HOST
DB_PORT: $DB_PORT
DB_USER: $DB_USER
DB_PASSWORD: $DB_PASSWORD
DB_NAME: $DB_NAME
DB_DRIVER: $DB_DRIVER
PHP_FPM_USER: wodby
PHP_FPM_GROUP: wodby
COLUMNS: 80 # Set 80 columns for docker exec -it.
volumes:
- ./Insider:/var/www/html
nginx:
image: wodby/nginx:$NGINX_TAG
container_name: "${PROJECT_NAME}_nginx"
depends_on:
- php
environment:
NGINX_STATIC_OPEN_FILE_CACHE: "off"
NGINX_ERROR_LOG_LEVEL: debug
NGINX_BACKEND_HOST: php
NGINX_SERVER_ROOT: /var/www/html/web
NGINX_VHOST_PRESET: $NGINX_VHOST_PRESET
ports:
- '8000:80'
volumes:
- ./Insider:/var/www/html
Run Code Online (Sandbox Code Playgroud)
现在我们需要在PHP容器启动后执行一些设置任务。现在我需要了解在此容器中执行配置的最佳方法是什么。我们有两个想法,如下。
但理想的过程是,如果我们能够以某种方式从我们的文件中在 PHP 容器中包含一个 shell 脚本docker-compose.yml,并且当我们运行它时,docker-compose up -d它应该作为该容器启动过程的一部分运行并准备好一切,所以我们不需要经历第二个命令/进程等。
为此有一个使用入口点脚本的标准模式。
无论您指定为容器的入口点,它都会作为主容器进程运行,并且它会作为命令行参数传递容器的命令。一个非常典型的入口点脚本具有以下形式
#!/bin/sh
# ... do startup-time setup ...
# Then launch the main container command
exec "$@"
Run Code Online (Sandbox Code Playgroud)
在你的 Dockerfile 中,你需要像平常一样复制它
COPY entrypoint.sh ./
# RUN chmod 0755 entrypoint.sh # if not already executable
ENTRYPOINT ["./entrypoint.sh"] # MUST be JSON-array form
CMD ["./my-app"]
Run Code Online (Sandbox Code Playgroud)
入口点脚本可以访问每次执行的设置,例如在 中设置的环境变量docker-compose.yml,并联系 Docker 中运行的其他服务。它可以是export主容器进程将看到的环境变量。(这些不会显示在其他面向调试的路径中,例如docker inspect或docker exec,但docker run --rm -it myimage sh会看到它们。)一个重要的警告是,入口点脚本将是此时容器中运行的唯一内容,因此它无法与除非它不遗余力地启动它(这很棘手),否则主容器进程将是什么。
我认为这种用法ENTRYPOINT非常有用且重要,因此我倾向于为此目的保留该指令。如果您只有一个ENTRYPOINT(像许多 Java SO 问题一样),您可以将其更改为,CMD不会产生任何不良影响。如果您曾经ENTRYPOINT命名过解释器和CMD脚本(就像许多 Python SO 问题一样),您可以将它们组合成一行CMD。
| 归档时间: |
|
| 查看次数: |
1920 次 |
| 最近记录: |