Tag: bash

如何通过图像名称删除所有的容器,如果已经删除,什么也不做

我有bash脚本停止并通过图像名称删除所有docker的容器。 我可以通过单个命令停止并通过图像名称移除所有docker集装箱 docker rm $(docker stop $( docker ps -a -q –filter ancestor=image_name)) 但是,如果容器不存在,则此expression式docker ps -a -q –filter ancestor=image_name不会返回任何内容,并且docker ps -a -q –filter ancestor=image_name docker stop命令将失败。 如何删除所有容器的图像名称,如果已经删除,什么也不做?

Dockerfile找不到入口点脚本

我想使用bash脚本作为dockerfile中的入口点。 代码如下: ENV INST INIT ADD start.sh /start.sh RUN chmod 777 /start.sh ENTRYPOINT /start.sh $INST 应该是对的。 但是当我build立图像并运行它时,结果如下: /bin/sh: 1: /start.sh: not found 任何人都可以帮我吗? 谢谢。 总Dockerfile: FROM debian:latest ENV INST INIT RUN apt-get update RUN apt-get install -y git build-essential gcc g++ vim RUN mkdir /Lab-C-Framework WORKDIR /Lab-C-Framework ADD Lab-C-Framework /Lab-C-Framework RUN make install RUN chmod […]

Docker shell'ls -l'缩进换行符

我将如何去设置docker镜像(比如ubuntu:latest的bash shell环境,以便在运行ls -l ,输出是我习惯的(直线列)? 即使使用ls -1我也会看到每一个换行符都是从上一行最后一个字符的位置开始的: 运行容器: docker run –rm -it ubuntu:latest bash root@b82014f4ddbf:/# ls -1 bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@b82014f4ddbf:/# 也许我错过了.bashrcconfiguration文件或其他常见的东西? TIA。

如何在Dockerfile中正确运行Docker cmds

Docker在Dockerfile中运行命令的方式与在启动容器后手动运行命令之间似乎有区别。 这似乎是由于你可以启动一个shell,一个(我假设)非Dockerfile与交互式shell之间运行诸如docker run -it docker run -it <some-img-id>非交互式shell。 我怎样才能在Docker容器中debugging运行命令,使其运行完全像命令从Dockerfile运行? 只是将/bin/bash –noprofile添加到run cmd就足够了吗? 或者从Dockerfile启动时环境还有什么不同?

当从Dockerfile调用脚本时,如何防止出现`#!/ bin / bash:not found`错误

我有以下的Dockerfile : FROM debian:stretch-backports MAINTAINER c33s ARG DEBIAN_FRONTEND=noninteractive COPY provision-base.sh /root/provision-base.sh RUN chmod +x /root/provision-base.sh && /root/provision-base.sh 为什么我得到以下错误运行它: …snip… /root/provision-base.sh: 1: /root/provision-base.sh: #!/bin/bash: not found …snip… 该文件存在RUN ls /root/provision-base.sh显示它 RUN which bash也显示bash被安装 该脚本开始并在错误之后继续 构build成功 在dockerhub上build立日志: https ://hub.docker.com/r/c33s/debian/builds/bd6g8cqr2rtys9a2gguehcw/(构build日志的片段也在pastebin https://pastebin.com/6x1UK53H上 )

Dockerfile与Tomcat:“exec:catalina.sh”没有这样的文件或目录

我试图让我的Web应用程序与Docker上的Tomcat一起工作。 不过,我在实际工作中遇到了一些麻烦。 我对Tomcat和Docker都是全新的,不太清楚我做错了什么。 我的Dockerfile看起来像: FROM java:8-jre #https://github.com/docker-library/tomcat ENV CATALINA_HOME ~/Tomcat ENV PATH $CATALINA_HOME/bin:$PATH RUN mkdir -p "$CATALINA_HOME" WORKDIR $CATALINA_HOME # see https://www.apache.org/dist/tomcat/tomcat-8/KEYS RUN gpg –keyserver pool.sks-keyservers.net –recv-keys \ 05AB33110949707C93A279E3D3EFE6B686867BA6 \ 07E48665A34DCAFAE522E5E6266191C37C037D42 \ 47309207D818FFD8DCD3F83F1931D684307A10A5 \ 541FBE7D8F78B25E055DDEE13C370389288584E7 \ 61B832AC2F1C5A90F0F9B00A1C506407564C17A3 \ 79F7026C690BAA50B92CD8B66A3AD3F4F22C4FED \ 9BA44C2621385CB966EBA586F72C284D731FABEE \ A27677289986DB50844682F8ACB77FC2E86E29AC \ A9C5DF4D22E99998D9875A5110C01C5A2F6059E7 \ DCFD35E0BF8CA7344752DE8B6FB21E8933C60243 \ F3A04C595DB5B6A5F1ECA43E3B7BBB100D811BBE \ F7DA48BB64BCB84ECBA7EE6935CD23C10D498E23 ENV TOMCAT_MAJOR 8 ENV […]

为什么我的Docker容器启动后不能将控制权交还给terminal?

我有一个shell脚本,我用它来导出Envvariables。 这个脚本调用python脚本从运行我的主python脚本之前需要存储的web服务中获取某些值。 我试过使用RUN . /bot/env/setenv.sh RUN . /bot/env/setenv.sh ,但是这似乎并不使envvariables在最终容器中可用。 我试过把内容放在一个以调用python jbot.py结尾的entrypoint.sh文件中,但容器永远不会完成它的设置(我假设因为入口点内的脚本是一个连续的循环?) 我的entrypoint.sh看起来像这样: #!/bin/bash . /jirabot/env/setenv.sh python jbot.py 而setenv.sh只是: #!/bin/bash export SLACK_BOT_TOKEN="xoxb-token" export BOT_ID=`python env/print_bot_id.py ${SLACK_BOT_TOKEN}` 我的完整的Dockerfile是: FROM python:2 COPY jirabot/ /jirabot/ RUN pip install slackclient schedule jira WORKDIR /jirabot #CMD [ "python", "jbot.py" ] ENTRYPOINT [ "/jirabot/entrypoint.sh" ] 当我做docker run bot ,我可以validation应用程序正在运行(机器人响应我的请求相应)。 但是,输出中缺lessjbot.py中的所有print()语句 – 所以我有两个主要问题: […]

在mysql中插入用户定义的variablesCREATE USER

我想创build一个shell脚本在docker CLI中运行,并创build一个MySQL用户,并将主机IP作为命令行variables传递。 所以用我的脚本将是./create_user.sh 172.17.0.1 我试着开始只在sql语句部分插入variables,并使用这样的东西: #!/bin/sh docker exec -i atb-mariadb bash <<'EOF' mysql -uroot -pmypass set @ip='172.17.0.1'; CREATE USER 'exporter'@@ip IDENTIFIED BY 'mypass'; GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'exporter'@'172.17.0.1'; GRANT SELECT ON performance_schema.* TO 'exporter'@'172.17.0.1'; SELECT user, host FROM mysql.user; exit EOF 这导致语法错误,以及一些其他的我试过: CREATE USER CONCAT_WS('exporter','@',@ip) IDENTIFIED BY 'mypass'; CREATE USER 'exporter'@CONCAT_WS('',@ip) IDENTIFIED […]

在Packer脚本中更改文件(使用sed)会使文件保持不变

目前我正在研究使用封隔器和dockerbuild造一条生产线。 这是我的packer.json: { "builders": [{ "type": "docker", "image": "php:7.0-apache", "commit": true }], "provisioners": [ { "type": "file", "source": "./", "destination": "/var/www/html/" }, { "type": "shell", "inline": [ "chown -R www-data:www-data /var/www/html", "sed '/<Directory \\/var\\/www\\/>/,/<\\/Directory>/ s/AllowOverride None/AllowOverride all/' /etc/apache2/apache2.conf", "sed '/<VirtualHost/,/<\\/VirtualHost>/ s/DocumentRoot \\/var\\/www\\/html/DocumentRoot \\/var\\/www\\/html\\/web/' /etc/apache2/sites-enabled/000-default.conf" ] } ] } provisioners部分中的Shell脚本包含用于更改apacheconfiguration中的AllowOverride和DocumentRootvariables的一些sed命令。 当封隔器运行这个脚本它工作得很好,我得到一个积极的sed输出,所以sed似乎工作正常。 但是在docker图像中文件没有改变。 复制文件供应商中的file工作正常。 我究竟做错了什么?

Dockerfile中的多行Rscript

我正在尝试使用R来构build一个Docker镜像,而且我希望能够以一种干净,易于阅读的方式跨越多行打破我的软件包安装步骤,但bash似乎并不喜欢这种方法不知道结局在哪里)。 有没有办法让这么长的一行代码分成多行? Rscript -e 'devtools::install_cran(c("tidytext","janitor","corrr","officer","devtools","pacman"))' 也许,像这样的东西: Rscript -e 'devtools::install_cran(c("tidytext","janitor", "corrr","officer","devtools","pacman"))' 这可能与Rscript? 我已经尝试在每行的末尾使用\,但它仍然无效。 我明白install2.r可以一行一行地列出包,但我想有一个包的向量传递给devtools::install_cran如果可能的话。 我已经看到其他人简单地通过Rscript调用它的R脚本,但我希望看到我的Dockerfile中的所有安装步骤,而不是复制并在我的容器中运行一个外部R脚本。 谢谢你的帮助。 Rscript test.R