在一个中运行多个命令的正确方法是什么action
?
我想将 python 脚本作为action
. 在运行此脚本之前,我需要安装requirements.txt
.
Dockerfile
其中的命令创建一个RUN pip install -r requirements.txt
。python:3
图像,并在运行pip install -r requirements.txt
in 中entrypoint.sh
的参数之前运行文件args
中的main.workflow
。pip install
和python myscript.py
作为args
我想运行一个存在于我的存储库中的脚本,然后比较 2 个文件(它的输出和一个已经存在的文件)。
这是一个包含两个命令的过程,而在第一个示例中,该pip install
命令可以被视为构建命令而不是测试命令。
我可以为另一个命令创建另一个 Docker,其中将包含前一个 Docker 的输出吗?
我正在寻找有关命令 in Dockerfile
、inentrypoint
或 in位置的指南args
。
我只是想重命名一些文件,而不覆盖 docker 拉入的 wordpress 图像中的命令。在 docker-compose.yml 中,我尝试使用“command”和“entrypoint”来运行 bash 命令,两者基本上都会中断正在执行的操作发生在图像内部,但一切都失败了。
我修改了https://hub.docker.com/_/solr/ 上docker-compose.yml
给出的文件,添加了一个volumes
结构和的改变entrypoint
。修改后的文件如下:
version: '3'
services:
solr:
image: solr
ports:
- "8983:8983"
volumes:
- ./solr/init.sh:/init.sh
- ./solr/data:/opt/solr/server/solr/mycores
entrypoint:
- init.sh
- docker-entrypoint.sh
- solr-precreate
- mycore
Run Code Online (Sandbox Code Playgroud)
我需要在入口点开始之前运行这个“init.sh”,以准备我在容器内的文件。
但我收到以下错误:
错误:对于solr_solr_1无法启动服务solr:oci运行时错误:container_linux.go:247:启动容器进程导致“exec:\”init.sh\“:在$PATH中找不到可执行文件”
早些时候我从这里找到了关于 Neo4j 中的官方图像钩子。我也可以在这里使用类似的东西吗?
更新 1:从下面的评论中,我意识到 dockerfile 设置是WORKDIR /opt/solr
由于 which executable file not found in $PATH
. 所以我通过使用提供入口点的绝对路径来测试/init.sh
. 但这也会产生错误,但有一个不同的错误:
standard_init_linux.go:178: exec 用户进程导致“exec 格式错误”
这是我纯粹好奇的问题:
我必须个性化 Docker 映像,特别是这是我的 dockerfile 的摘录:
ARG DEFAULT_PHP_VERSION
FROM php:${DEFAULT_PHP_VERSION:+${DEFAULT_PHP_VERSION}-}fpm-alpine
# RUN some personal stuff
RUN rm -rf /var/www/html
# Set proper Entrypoint
COPY build/fs/usr/local/bin/my-entrypoint.sh /usr/local/bin/my-entrypoint.sh
RUN chmod +x /usr/local/bin/my-entrypoint.sh
ENTRYPOINT [ "my-entrypoint.sh" ]
WORKDIR /var/www
Run Code Online (Sandbox Code Playgroud)
并且my-entrypoint.sh
是:
#!/bin/sh
set -e
echo "Trying my-entrypoint with args: $@"
if [ ! -z "$XDEBUG_ENABLED" ] ; then
echo "Enabling XDEBUG"
docker-php-ext-enable xdebug
fi
# execute default entrypoint
echo "Execute Main:"
docker-php-entrypoint $@
echo "Main Done"
Run Code Online (Sandbox Code Playgroud)
原始图像PHP-FPM-ALPINE
具有命令
CMD [ "php-fpm" …
Run Code Online (Sandbox Code Playgroud) 我目前正在尝试处理对 kubernetes 集群的部署。部署不断失败并响应
Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "exec: \"/entrypoint.sh\": permission denied"
Run Code Online (Sandbox Code Playgroud)
我试图更改文件的权限,这似乎成功了,就像我 ls -l 我得到 -rwxr-xr-x 作为文件的权限一样。
我曾尝试将 chmod 命令放在 dockerfile 本身以及构建和上传图像之前,但似乎都没有任何区别。任何想法为什么我仍然收到错误?
下面的 dockerfile
FROM node:10.15.0
CMD []
ENV NODE_PATH /opt/node_modules
# Add kraken files
RUN mkdir -p /opt/kraken
ADD . /opt/kraken/
# RUN chown -R node /opt/
WORKDIR /opt/kraken
RUN npm install && \
npm run build && \
npm prune --production
# Add the entrypoint
COPY ./entrypoint.sh /entrypoint.sh
RUN chmod …
Run Code Online (Sandbox Code Playgroud) 我正在配置一个在容器启动后执行的入口点:
COPY entrypoint.sh /entrypoint.sh
RUN ["chmod", "+x", "/entrypoint.sh"]
ENTRYPOINT exec /entrypoint.sh
Run Code Online (Sandbox Code Playgroud)
但是,我无法看到entrypoint.sh
执行时的输出docker-compose up
。
唯一的输出是:
服务退出,代码为 2
容器被杀死所以我不能做docker logs <container_id>
我尝试过使用docker events
命令,但没有看到任何与entrypoint.sh
.
我知道入口点文件有错误,但我想查看执行的输出。
有任何想法吗?
我们可以有一个没有入口点的 {docker run} 命令吗?据我所知,必须有一个入口点(如果未指定,则在大多数情况下应默认为“bash”)。否则,我无法将图像作为容器运行。
假设我在物理机上安装 Linux。
有一个后台服务在后台运行,监听端口然后做一些事情。
在我登录之前,没有运行 bash shell,我仍然可以通过名称和端口从另一台计算机调用后台服务。
我可以通过 {docker run} 做类似的事情吗?这意味着,我不需要入口点(或者入口点是系统进程而不是 bash?),只需让容器系统及其后台服务启动并运行即可。
假设我在 Dockerfile 中有这个:
ARG FOO=1
ENTRYPOINT ["docker.r2g", "run"]
Run Code Online (Sandbox Code Playgroud)
我用以下方法构建上述内容:
docker build -t "$tag" --build-arg FOO="$(date +%s)" .
Run Code Online (Sandbox Code Playgroud)
有没有办法做这样的事情:
ENTRYPOINT ["docker.r2g", "run", ARG FOO] // something like this
Run Code Online (Sandbox Code Playgroud)
我想这个论点也可以通过 withdocker run
而不是在docker build
阶段期间传递?
我无法从入口点脚本将用户切换到非 root 用户。在 Dockerfile 中更改用户的 User 指令有效,但我无法使用 chmod 更改权限。为了解决这个问题,我创建了entrypoint.sh
脚本来更改文件夹权限,但是当我尝试使用su
命令切换用户时,它显然不起作用,容器仍然以 root 身份运行。
Dockerfile
FROM php:7.2-fpm
# Installing dependencies
RUN apt-get update && apt-get install -y \
build-essential \
mysql-client \
libpng-dev \
libjpeg62-turbo-dev \
libfreetype6-dev \
locales \
zip \
jpegoptim optipng pngquant gifsicle \
vim \
unzip \
git \
curl
# Installing composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
ENV USER_ID=1000
ENV GROUP_ID=1000
ENV USER_NAME=www
ENV GROUP_NAME=www
RUN groupadd -g $GROUP_ID $GROUP_NAME …
Run Code Online (Sandbox Code Playgroud) switch-user docker dockerfile docker-compose docker-entrypoint
当我Debian
从 docker-compose构建我的图像时,使用命令$ docker-compose -f docker-compose-dev.yml build web
,如下所示:
docker-compose-fev.yml
services:
web:
build:
context: ./services/web
dockerfile: Dockerfile-dev
volumes:
- './services/web:/usr/src/app'
ports:
- 5001:5000
environment:
- FLASK_ENV=development
- APP_SETTINGS=project.config.DevelopmentConfig
- DATABASE_URL=postgres://postgres:postgres@web-db:5432/web_dev
- DATABASE_TEST_URL=postgres://postgres:postgres@web-db:5432/web_test
- SECRET_KEY=my_precious
depends_on:
- web-db
- redis
Run Code Online (Sandbox Code Playgroud)
好像它似乎成功构建了所有包,我得到:
web_1| /usr/src/app/entrypoint.sh: 5: /usr/src/app/entrypoint.sh: nc: not found
Run Code Online (Sandbox Code Playgroud)
如果我更改#!/bin/sh
为#!/bin/bash
,则错误日志更改:
web_1| /usr/src/app/entrypoint.sh: line 5: nc: command not found
Run Code Online (Sandbox Code Playgroud)
Dockerfile:
FROM python:3.7-slim-buster
RUN apt-get update && apt-get -y dist-upgrade
RUN apt-get -y install build-essential libssl-dev libffi-dev libblas3 …
Run Code Online (Sandbox Code Playgroud)