我有一个无法编辑但需要在 Docker 容器中运行的文件。因为该文件没有扩展名,所以我必须使用 chmod 来设置文件可执行文件。但是当我从 docker 文件构建 docker 镜像后,我总是得到一个"permission denied" error
我的泊坞窗文件:
FROM alpine
COPY . /home/guestuser/bin/gateway
RUN apk add libressl-dev
RUN apk add libffi-dev
RUN pwd
WORKDIR /home/guestuser/bin/.
RUN ["chmod", "+x", "gateway"]
RUN pwd
CMD ["/home/guestuser/bin/gateway"]
EXPOSE 11878
Run Code Online (Sandbox Code Playgroud)
我总是收到这个错误:
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"/home/guestuser/bin/gateway\": permission denied": unknown.
Run Code Online (Sandbox Code Playgroud)
正如我已经提到的,我无法编辑我想要执行的文件。我究竟做错了什么?
我们有一个构建管道,它首先使用 dockerfile 进行 docker 构建。该 dockerfile 有许多 COPY 命令。我们还有一个后续步骤,使用“cp”命令执行 docker 运行,如下所示:
docker run --volume /hostDirA:/containerDirB --workdir /folderB dockerRepo:somebuildnum cp -R /hostDirC/。/containerDirB
首先,在要点之前,我的理解是 cp 命令是将一个文件夹复制到另一个文件夹,这两个文件夹都在容器上。这是正确的理解吗?
其次,当 COPY 已经通过 dockerfile 在 docker 构建中完成时,为什么要在 docker run 中以这种方式完成 cp ?我们是否有正当理由不将此 cp 移至 dockerfile 内?
我们正在尝试在 AWS ECS 上启动 Fargate 容器。在容器定义中我们有
"command": [
"/bin/bash",
"-c",
"\"envsubst < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'\""
]
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
"command": [
"/bin/bash",
"-c",
"envsubst < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
]
Run Code Online (Sandbox Code Playgroud)
使用docker run,我们将成功使用:
docker run -p 8000:80 -e "VAR1=somevalue" -d nginx-sample:latest /bin/bash -c "envsubst < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
Run Code Online (Sandbox Code Playgroud)
在 kubernetes 世界中(也有效):
containers:
env:
- name: VAR1
value: "somevalue"
command: ["/bin/bash"]
args: ["-c", "envsubst < …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 docker run 命令通过 Dockerfile 运行 docker 容器。以下是我的 Dockerfile。
FROM python:3.6
# for imaging stuff
RUN apt-get update
RUN apt install libmagickwand-dev
# Create app directory
RUN mkdir -p /home/test/app
# Install Libre Office and ghostscript for pdf conversion and repairing
RUN apt-get update -qq \
&& apt-get install -y -q libreoffice \
&& apt-get remove -q -y libreoffice-gnome \
&& apt-get update \
&& apt-get -y install ghostscript \
&& apt-get -y install nano \
&& apt-get -y install …Run Code Online (Sandbox Code Playgroud) 有没有办法配置 docker run 使用 https?就像是:
docker run --https --certs xyz myimage
Run Code Online (Sandbox Code Playgroud)
或者你必须在 Dockerfile/image 中配置这些东西吗?对于 TLS 也是如此。
docker run --tls --certs xyz myimage
Run Code Online (Sandbox Code Playgroud)
优点之一是我们不必将证书复制到映像中 - 我宁愿避免在映像和/或正在运行的容器中包含证书。
尽管我认为最佳实践是使用将-v主机中的证书共享到容器中的选项。
更新:经过一些研究,我发现了这个: https: //docs.docker.com/engine/security/https/
它说用这样的东西启动 docker 域:
dockerd --tlsverify --tlscacert=ca.pem \
--tlscert=server-cert.pem --tlskey=server-key.pem \
-H=0.0.0.0:2376
Run Code Online (Sandbox Code Playgroud)
为了保护机器上的所有容器,这样做是否正确?
我需要使用官方的 PowerShell Core Docker 映像来运行 Docker 容器并使其执行 PowerShell 脚本文件。
我知道可以使用 Dockerfile 和 Docker 构建来完成,但在这种情况下不能使用它。
通过阅读文档,我想出了这个,但它似乎不起作用:
docker run -it --rm --entrypoint "/tmp/test.ps1" repo/powershell:latest
docker: Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"/tmp/test.ps1\": stat /tmp/test.ps1: no such file or directory": unknown.
ERRO[0001] error waiting for container: context canceled
Run Code Online (Sandbox Code Playgroud)
错误似乎表明它找不到该文件,但stat "/tmp/test.ps1"手动运行时它工作正常。
我觉得pwsh还应该指定二进制文件,但找不到如何执行此操作的方法。
给出以下命令:
docker run -dit -p 9080:9080 -p 9443:9443 -p 2809:2809 -p 9043:9043 --name container_name --net=host myimage:latest bash
Run Code Online (Sandbox Code Playgroud)
如何将其转换为等效的 docker-compose.yml 文件?
我知道每个 RUN 命令都会创建一个层。假设我有以下 RUN 命令:
RUN python -m pip install --upgrade pip
RUN python -m pip install --upgrade setuptools
RUN pip install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)
我希望在一个运行命令中运行所有命令。下面这个可以用吗?
RUN python -m pip install --upgrade pip; python -m pip install --upgrade setuptools; pip install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)
如果我使用以下内容,则会出现错误“标记‘&&’在此版本中不是有效的语句分隔符。”:
RUN python -m pip install --upgrade pip && python -m pip install --upgrade setuptools && pip install -r requirements.txt
Run Code Online (Sandbox Code Playgroud) 在我的 application.yml 文件中,我添加了 8080 上的服务器端口。
server:
port: 8080
Run Code Online (Sandbox Code Playgroud)
现在在我的 Dockerfile 中,我公开了端口范围8080-8089。我的目标是在不同的外部和内部端口上运行此映像。
我的 Dockerfile 如下
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} user-service.jar
EXPOSE 8000-8089
ENTRYPOINT ["java","-jar","/user-service.jar"]
Run Code Online (Sandbox Code Playgroud)
我的 docker 镜像构建命令如下:
docker image build -t user-service .
Run Code Online (Sandbox Code Playgroud)
现在构建此映像后,我的 docker run 命令如下:
docker run -d -p 8080:8080 -it user-service
Run Code Online (Sandbox Code Playgroud)
这里,user-service是我的 docker 镜像 TAG。之后,我可以在 8080 端口上访问该应用程序。
但问题是,当我使用端口映射 -p 8081:8081 运行另一个容器时,应用程序正在运行,但无法使用端口 8081 进行访问。
我的 docker 运行命令是:
docker run -d -p 8081:8081 -it user-service
Run Code Online (Sandbox Code Playgroud)
现在我的目标是我想用 docker 中的外部和内部端口映射跳过 application.yml 服务器端口
注意事项:
docker-run ×10
docker ×9
dockerfile ×5
docker-build ×2
amazon-ecs ×1
aws-fargate ×1
bash ×1
chmod ×1
devops ×1
docker-image ×1
https ×1
powershell ×1
spring-boot ×1
ssl ×1