我发现在使用时docker run
我有时不需要添加"命令",而有时候"命令"是必须的.例如,在运行ubuntu
映像时,不需要命令:
# docker run ubuntu
#
Run Code Online (Sandbox Code Playgroud)
在运行时mstormo/suse
:
# docker run mstormo/suse
Error response from daemon: No command specified
# docker run mstormo/suse bash
#
Run Code Online (Sandbox Code Playgroud)
那么这与指定的图像有关吗?
entrypoint.sh
我的工作区中没有这样的文件名。
但下面的指令docker-compose.yml
是指它:
builder:
build: ../../
dockerfile: docker/dev/Dockerfile
volumes:
- ../../target:/wheelhouse
volumes_from:
- cache
entrypoint: "entrypoint.sh"
command: ["pip", "wheel", "--non-index", "-f /build", "."]
Run Code Online (Sandbox Code Playgroud)
哪里../docker/dev/Dockerfile
有
# Set defaults for entrypoint and command string
ENTRYPOINT ["test.sh"]
CMD ["python", "manage.py", "test", "--noinput"]
Run Code Online (Sandbox Code Playgroud)
什么是entrypoint: "entrypoint.sh"
真正做到?
docker dockerfile docker-compose docker-entrypoint docker-command
我创建了一个集装箱码头.哪个应该给出以下内容:
docker run --rm container1
> Hello World!
docker run --rm container1 Bob
> Hello Bob!
Run Code Online (Sandbox Code Playgroud)
我的Dockerfile:
FROM ubuntu:14.04
ENTRYPOINT ["/bin/echo", "Hello"]
CMD ["World!"]
Run Code Online (Sandbox Code Playgroud)
我的输出:
docker run --rm container1
> Hello World!
docker run --rm container1 Bob
> Hello Bob
Run Code Online (Sandbox Code Playgroud)
我有一个损失"!"
我已阅读有关 CMD 和 ENTRYPOINT 的文档
https://docs.docker.com/engine/reference/builder/#entrypoint
在这里,他们在表中提到“不允许使用 CMD 和 NO ENTYRPOINT”,但是我创建了一个没有 CMD 和 ENTRYPOINT 的 Dockerfile,并且镜像构建成功。下载高山焦油从这里高山焦油
文件
from scratch
ADD alpine-minirootfs-3.11.2-x86_64.tar.gz /
COPY . /
Run Code Online (Sandbox Code Playgroud)
构建图像:
docker build -t test:1 .
Sending build context to Docker daemon 2.724MB
Step 1/3 : from scratch
-----
Successfully tagged test:1
docker run -ti test:1 /bin/sh
/ #
Run Code Online (Sandbox Code Playgroud)
有效!!那么为什么在文档中提到 CMD 或 ENTRYPOINT 是必要的?
我试图了解docker compose中的COMMAND选项.在我目前的docker-compose.yml中,我启动了韵文docker镜像(https://github.com/prosody/prosody-docker),我想在实际启动容器时创建一个用户列表.
容器的文档说明可以使用环境选项来创建用户LOCAL, DOMAIN, and PASSWORD
,但这只是一个用户.我需要一个用户列表.
当阅读互联网上的一些东西时,似乎使用命令选项我应该能够在启动或运行容器中执行命令.
xmpp:
image: prosody/prosody
command: prosodyctl register testuser localhost testpassword
ports:
- "5222:5222"
- "127.0.0.1:5347:5347"
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用,我检查运行容器使用docker exec -it <imageid> bash
但没有创建用户.
是否可以使用docker-compose在已启动的容器上执行命令,还是有其他选项?
我正在使用AWS"带有容器的Windows Server 2016 Base"映像(ami-5e6bce3e).
使用docker info
我可以确认我有最新的(服务器版本:1.12.2-cs-ws-beta).
从Powershell(以管理员身份运行),我可以在交互模式下成功运行"microsoft/windowsservercore"容器,连接到容器中的CMD:
docker run -it microsoft/windowsservercore cmd
Run Code Online (Sandbox Code Playgroud)
当我尝试以交互模式运行"microsoft/iis"容器时,虽然我能够连接到IIS(通过浏览器),但我从未连接到容器中的交互式CMD会话.
docker run -it -p 80:80 microsoft/iis cmd
Run Code Online (Sandbox Code Playgroud)
相反,我只是得到:
服务'w3svc'开始了
使用另一个Powershell窗口,我可以:
docker container ls
Run Code Online (Sandbox Code Playgroud)
...并看到我的容器正在运行.
试图附加锁定而永不返回.
我已经切换了区域,发现每个区域都有不同的AMI:
......这两个都有相同的结果.
使用的相关链接:
更新
使用以下链接,我能够基于服务器基础创建自己的Dockerfile并安装IIS,这似乎工作正常.
我是 Docker 新手。我的 Dockerfile(从教程中获得)是:
\n\nFROM ubuntu\n\nENV DEBIAN_FRONTEND noninteractive\n\nRUN apt-get update \\\n&& apt-get install -y --no-install-recommends apache2 \\\n libapache2-mod-jk\nVOLUME ["/var/log/apache2"]\nRUN echo \'ServerName localhost\' >> /etc/apache2/apache2.conf\nEXPOSE 80 443\n\nENTRYPOINT ["apache2ctl", "-D", "FOREGROUND"]\n
Run Code Online (Sandbox Code Playgroud)\n\n我给了docker build -t mg:httpd apache\\
。没有错误。
\xce\xbb docker images\nREPOSITORY TAG IMAGE ID CREATED SIZE\nmg httpd 262d7a4f85fc About an hour ago 248MB\n
Run Code Online (Sandbox Code Playgroud)\n\ndocker run -it mg:httpd
没有错误,但光标立即返回到命令提示符。继续Unable to connect
服用http://localhost/
浏览器。
\xce\xbb docker ps -a\nCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS \n600231bbd461 mg:httpd …
Run Code Online (Sandbox Code Playgroud) 我遇到了 docker-compose 的问题。我是 docker 的新手。
我可以成功构建我的 R 服务器。这是 Dockerfile:
FROM ubuntu:16.04
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9
RUN echo "deb http://cran.r-project.org/bin/linux/ubuntu trusty/" | tee -a /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y build-essential
RUN apt-get install -y curl libcurl4-openssl-dev
RUN apt-get install -y apt-utils
RUN apt-get install -y r-base
RUN apt-get install -y r-base-dev
RUN apt-get install -y libssl-dev
ENTRYPOINT ["/usr/bin/R"]
Run Code Online (Sandbox Code Playgroud)
这是我的 docker compose 文件,其中有一个需要调用 R 的 python 工作服务器:
version: '3'
services:
worker:
build: .
image: mtm/mtm-worker-server
r-server: …
Run Code Online (Sandbox Code Playgroud) 我正在创建用于在Docker容器上运行Terraform的Jenkins管道。
这是我的管道脚本。
pipeline {
agent {
docker {
image 'hashicorp/terraform:full'
args '--entrypoint=/bin/bash'
}
}
stages {
stage('execute') {
steps {
sh 'terraform --version'
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在詹金斯上运行此管道时,出现以下错误。
$ docker run -t -d -u 995:993 --entrypoint=/bin/bash -w /var/lib/jenkins/workspace/terraform -v /var/lib/jenkins/workspace/terraform:/var/lib/jenkins/workspace/terraform:rw,z -v /var/lib/jenkins/workspace/terraform@tmp:/var/lib/jenkins/workspace/terraform@tmp:rw,z -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** …
Run Code Online (Sandbox Code Playgroud) docker 文档说你可以构建这个最小的镜像:
FROM scratch
ADD hello /
CMD ["/hello"]
Run Code Online (Sandbox Code Playgroud)
据推测,其工作方式是该CMD
步骤使用默认 shell(即,bin/sh
根据/sf/answers/1509549331/)来运行hello
可执行文件。
但如果 SCRATCH 真的完全是空的,那么它从哪里来呢bin/sh
?为什么我的图像包含外壳?