在Bash中,似乎有几个变量具有特殊的,一致意义的值.例如,
./myprogram &; echo $!
Run Code Online (Sandbox Code Playgroud)
将返回后台进程的PID myprogram.我知道其他人,比如$?我认为是目前的TTY.还有其他人吗?
从Bash参考手册我得到以下关于execbash builtin命令:
如果提供了命令,它将替换shell而不创建新进程.
现在我有以下bash脚本:
#!/bin/bash
exec ls;
echo 123;
exit 0
Run Code Online (Sandbox Code Playgroud)
执行了,我得到了这个:
cleanup.sh ex1.bash file.bash file.bash~ output.log
(files from the current directory)
Run Code Online (Sandbox Code Playgroud)
现在,如果我有这个脚本:
#!/bin/bash
exec ls | cat
echo 123
exit 0
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
cleanup.sh
ex1.bash
file.bash
file.bash~
output.log
123
Run Code Online (Sandbox Code Playgroud)
我的问题是:
如果在exec调用它取代了壳,而无需创建一个新的进程,为什么放时| cat,将echo 123被打印出来,但是没有它,它不是.所以,如果有人能解释这种行为的逻辑,我会很高兴.
谢谢.
编辑:@torek回复后,我更难解释行为:
1. exec ls>out命令创建out文件并输入ls命令结果;
2. exec ls>out1 ls>out2只创建文件,但不要放入任何结果.如果命令按照建议工作,我认为命令编号2应该与命令编号1具有相同的结果(更多,我认为它不应该创建out2文件).
例如在redis官方图片中:
https://github.com/docker-library/redis/blob/master/2.8/docker-entrypoint.sh
#!/bin/bash
set -e
if [ "$1" = 'redis-server' ]; then
chown -R redis .
exec gosu redis "$@"
fi
exec "$@"
Run Code Online (Sandbox Code Playgroud)
为什么不像往常一样运行命令而不在它们之前的exec?
这是我的问题.在bash 3中:
$ test='One "This is two" Three'
$ set -- $test
$ echo $2
"This
Run Code Online (Sandbox Code Playgroud)
如何获得的bash了解行情,并返回$ 2作为This is two和不"This?不幸的是,我不能改变test这个例子中调用的变量的构造.
我有以下docker compose file(docker-compose-dev.yml):
version: '3'
services:
my_sql_db:
image: percona:latest
container_name: my_sql_db
environment:
Run Code Online (Sandbox Code Playgroud)
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: abhs
ports:
- "3306:3306"
migration:
image: boxfuse/flyway:latest
container_name: flyway_migration
volumes:
- ./flyway_scripts/src/main/resources/db/migration:/flyway/sql
command: -url=jdbc:mysql://my_sql_db:3306/abhs?useUnicode=true&characterEncoding=utf8&useSSL=false -user=root -password=password migrate
depends_on:
- my_sql_db
Run Code Online (Sandbox Code Playgroud)
以下docker-compose.yml:
version: '3'
services:
migration:
image: boxfuse/flyway:latest
container_name: flyway_migration
volumes:
- ./flyway_scripts/src/main/resources/db/migration:/flyway/sql
Run Code Online (Sandbox Code Playgroud)
然后我执行以下命令:
docker-compose -f docker-compose.yml -f docker-compose-dev.yml up
Run Code Online (Sandbox Code Playgroud)
它导致错误:
在日志中我看到以下内容:
my_sql_db | Initializing database
flyway_migration | Flyway Community Edition 5.1.4 by Boxfuse
flyway_migration |
my_sql_db | 2018-08-24T08:47:41.616694Z 0 [Warning] 'NO_ZERO_DATE', …Run Code Online (Sandbox Code Playgroud) 当我尝试安装 logstash 插件后,我尝试使用docker-compose但docker 安装 logstash。exited with code 0Installation successful
logstash 的 docker-compose 文件部分是:
logstash:
image: docker.elastic.co/logstash/logstash-oss:7.0.1
ports: ['9600:9600']
command: bin/logstash-plugin install logstash-filter-metricize
volumes:
- ./logstash/pipeline/:/usr/share/logstash/pipeline/
Run Code Online (Sandbox Code Playgroud)
日志是:
logstash_1 |Validating logstash-filter-metricize
logstash_1 |Installing logstash-filter-metricize
logstash_1 |Installation successful
logstash_1 exited with code 0
Run Code Online (Sandbox Code Playgroud)
如果我尝试不安装插件,我的 docker-compose 工作正常。我不明白安装插件时我做错了什么。
Dockerfile
FROM centos:7
COPY docker-entrypoint.sh /data/
ENTRYPOINT ["/data/docker-entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)
docker-entrypoint.sh
exec /usr/sbin/init && systemctl restart autofs %% python /data/myapp.py
Run Code Online (Sandbox Code Playgroud)
我需要/usr/sbin/init作为第一个命令运行,然后运行后续命令,如systemctl restart autofs和python myapp.py
我似乎无法让所有工作在docker-entrypoint.sh内部因为/usr/sbin/init不返回
如果我将docker-entrypoint.sh更改为
/usr/sbin/init &
systemctl restart autofs && python /data/myapp.py
Run Code Online (Sandbox Code Playgroud)
它在d-bus中失败并出错
我能做什么,容器运行/usr/sbin/init,systemctl restart autofs并按python /data/myapp.py顺序执行"docker run"时?
/usr/sbin/init执行后是否还有其他方法可以运行命令?我已经尝试将systemctl作为CMD放在Dockerfile中
FROM centos:7
ENTRYPOINT ["/usr/sbin/init"]
CMD ["systemctl restart autofs"]
Run Code Online (Sandbox Code Playgroud)
但CMD永远不会被执行
我有一个使用 docker 和 laravel 运行的应用程序,但有一些指令显然已执行但无法运行。
这些说明是php artisan clear:cache和php artisan optimize。有时我需要进入容器并运行这些指令,以便在浏览器中反映我的更改。除了 kubernetes 由于未反映的更改而检测到的故障
FROM php:7.2.0-fpm as php
RUN apt-get update && apt-get install -y openssl openssh-client \
rsync sshpass zip unzip git vim libmcrypt-dev mysql-client \
libssh2-1-dev libmagickwand-dev \n
gnupg2 --no-install-recommends zlib1g-dev sass \
&& pecl install mcrypt-1.0.1 \
&& docker-php-ext-enable mcrypt \
&& pecl install imagick \
&& docker-php-ext-enable imagick \
&& docker-php-ext-install pdo_mysql \
&& docker-php-ext-install gd \
&& docker-php-ext-install zip \
&& pecl install …Run Code Online (Sandbox Code Playgroud)