相关疑难解决方法(0)

什么是特殊的美元符号shell变量?

在Bash中,似乎有几个变量具有特殊的,一致意义的值.例如,

./myprogram &; echo $!
Run Code Online (Sandbox Code Playgroud)

将返回后台进程的PID myprogram.我知道其他人,比如$?我认为是目前的TTY.还有其他人吗?

bash environment-variables dollar-sign

751
推荐指数
3
解决办法
30万
查看次数

需要解释Linux bash builtin exec命令行为

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文件).

linux bash flow exec

36
推荐指数
1
解决办法
3万
查看次数

在docker入口点脚本中使用exec的目的是什么?

例如在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 docker

31
推荐指数
2
解决办法
1万
查看次数

将字符串转换为参数时,Bash不解析引号

这是我的问题.在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这个例子中调用的变量的构造.

string bash arguments spaces quoting

11
推荐指数
2
解决办法
2981
查看次数

如何在Docker中初始化数据库后启动flyway

我有以下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)

java mysql depends flyway docker

11
推荐指数
1
解决办法
4593
查看次数

如何使用 docker-compose 安装 logstash 插件?

当我尝试安装 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 工作正常。我不明白安装插件时我做错了什么。

logstash docker-compose

7
推荐指数
2
解决办法
6042
查看次数

Dockerfile:运行/ usr/sbin/init

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 autofspython 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 dockerfile

4
推荐指数
1
解决办法
8858
查看次数

Docker 和 Laravel 不清除缓存

我有一个使用 docker 和 laravel 运行的应用程序,但有一些指令显然已执行但无法运行。

这些说明是php artisan clear:cachephp 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)

laravel docker dockerfile laravel-5.7 laravel-artisan

2
推荐指数
1
解决办法
3611
查看次数