将 CAT 命令 unix 启动到 Dockerfile
launch a CAT command unix into Dockerfile
我想启动这个 vagrant 命令 cat(运行 完美!)来为我的容器提供 Dockerfile :
# Configure Virtualenvwrapper.
RUN cat <<EOF >> /home/docker/.bashrc
# Virtualenvwrapper configuration.
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/Devel
source /usr/local/bin/virtualenvwrapper.sh
EOF
但是当我启动我的建筑图像时出现这个错误 return docker :
---> 40f9ed8e187d
Removing intermediate container 85f6c8536520
Step 69 : RUN cat <<EOF >> /home/docker/.bashrc
---> Running in dcbb3d441f79
---> 78acd9c2e5d5
Removing intermediate container dcbb3d441f79
Step 70 : EXPORT
Unknown instruction: EXPORT
运行 使用 Dockerfile 将 cat 命令 unix 转换为映像的技巧是什么?
Dockerfile 不是批处理文件。每个 line/command 都是隔离和提交的。
只需将内容放入文件中,然后 ADD/COPY 即可。如果您需要对其进行自定义,请对其进行 SED。或者,如果您真的、真的、真的想将 CAT 放入文件中——将其放入真正的批处理文件中,然后 ADD/COPY,然后 运行。
此外,更少的线条 = 更少的层数。 70 步?尤泽尔。
基于 this comment 在 Github 上发布的问题,此方法有效:
RUN echo 'All of your\n\
multiline that you ever wanted\n\
into a dockerfile\n'\
>> /etc/example.conf
你可以这样写:
RUN echo "# Virtualenvwrapper configuration." >> /home/docker/.bashrc && \
echo "export WORKON_HOME=$HOME/.virtualenvs" >> /home/docker/.bashrc && \
echo "export PROJECT_HOME=$HOME/Devel" >> /home/docker/.bashrc && \
echo "source /usr/local/bin/virtualenvwrapper.sh" >> /home/docker/.bashrc
您也可以在 Dockerfile
中使用以下命令代替此处文档 <<
RUN echo $'[kubernetes] \n\
name=Kubernetes \n\
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 \n\
enabled=1 \n\
gpgcheck=1 \n\
repo_gpgcheck=1 \n\
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg \n '\
> /etc/yum.repos.d/kubernetes.repo
更新 [07/29/2021]:从 dockerfile/dockerfile:1.3.0-labs
开始,Here-Document syntax is now supported with the Docker BuildKit backend enabled.
您需要使用 Docker Buildkit by setting DOCKER_BUILDKIT=1
in your environment, set the syntax 解析器指令才能使用 dockerfile/dockerfile:1.3.0-labs
,并将此处分隔符的位置与 cat
交换。其余正常使用。
Docker文件示例:
# syntax = docker/dockerfile:1.3-labs
...
RUN <<EOF cat >> /home/docker/.bashrc
# Virtualenvwrapper configuration.
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/Devel
source /usr/local/bin/virtualenvwrapper.sh
EOF
在 Docker BuildKit 实验室频道 dockerfile/dockerfile:1.3.0-labs
发布之前,不要使用 cat
,请尝试使用 echo
!
把这个 shell cat
例子...
#!/usr/bin/env sh
cat <<EOF > /tmp/example.txt
line 1
line 2
line 3
EOF
... 进入此 Docker 文件 echo
示例!
RUN echo -e '\
line 1\n\
line 2\n\
line 3\
' > /tmp/example.txt
注意 echo
示例中的一对单引号 ('
)。
还要注意 echo
的 -e
标志以支持转义换行符 (\n
)。
注意: 不幸的是,根据您安装的 echo
版本,可能需要也可能不需要 -e
标志。例如,npm:16
图像的 echo
不需要 -e
,实际上会打印 -e
以及单引号行。另一方面,ubuntu:20.04
图像的 echo
确实需要 -e
.
同样的例子可以写在一行中:
RUN echo -e 'line 1\nline 2\nline 3' >> /tmp/example.txt
,但我觉得上面的例子更具可读性。
要回答 OP 的问题,请使用:
# Configure Virtualenvwrapper.
RUN echo -e '\
# Virtualenvwrapper configuration.\n\
export WORKON_HOME=$HOME/.virtualenvs\n\
export PROJECT_HOME=$HOME/Devel\n\
source /usr/local/bin/virtualenvwrapper.sh\
' >> /home/docker/.bashrc
注意: 转义符可以通过escape
directive重新定义。如果您的 Docker 文件具有不同的转义字符集,您需要相应地修改示例。
我想启动这个 vagrant 命令 cat(运行 完美!)来为我的容器提供 Dockerfile :
# Configure Virtualenvwrapper.
RUN cat <<EOF >> /home/docker/.bashrc
# Virtualenvwrapper configuration.
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/Devel
source /usr/local/bin/virtualenvwrapper.sh
EOF
但是当我启动我的建筑图像时出现这个错误 return docker :
---> 40f9ed8e187d
Removing intermediate container 85f6c8536520
Step 69 : RUN cat <<EOF >> /home/docker/.bashrc
---> Running in dcbb3d441f79
---> 78acd9c2e5d5
Removing intermediate container dcbb3d441f79
Step 70 : EXPORT
Unknown instruction: EXPORT
运行 使用 Dockerfile 将 cat 命令 unix 转换为映像的技巧是什么?
Dockerfile 不是批处理文件。每个 line/command 都是隔离和提交的。
只需将内容放入文件中,然后 ADD/COPY 即可。如果您需要对其进行自定义,请对其进行 SED。或者,如果您真的、真的、真的想将 CAT 放入文件中——将其放入真正的批处理文件中,然后 ADD/COPY,然后 运行。
此外,更少的线条 = 更少的层数。 70 步?尤泽尔。
基于 this comment 在 Github 上发布的问题,此方法有效:
RUN echo 'All of your\n\
multiline that you ever wanted\n\
into a dockerfile\n'\
>> /etc/example.conf
你可以这样写:
RUN echo "# Virtualenvwrapper configuration." >> /home/docker/.bashrc && \
echo "export WORKON_HOME=$HOME/.virtualenvs" >> /home/docker/.bashrc && \
echo "export PROJECT_HOME=$HOME/Devel" >> /home/docker/.bashrc && \
echo "source /usr/local/bin/virtualenvwrapper.sh" >> /home/docker/.bashrc
您也可以在 Dockerfile
中使用以下命令代替此处文档 <<RUN echo $'[kubernetes] \n\
name=Kubernetes \n\
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 \n\
enabled=1 \n\
gpgcheck=1 \n\
repo_gpgcheck=1 \n\
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg \n '\
> /etc/yum.repos.d/kubernetes.repo
更新 [07/29/2021]:从 dockerfile/dockerfile:1.3.0-labs
开始,Here-Document syntax is now supported with the Docker BuildKit backend enabled.
您需要使用 Docker Buildkit by setting DOCKER_BUILDKIT=1
in your environment, set the syntax 解析器指令才能使用 dockerfile/dockerfile:1.3.0-labs
,并将此处分隔符的位置与 cat
交换。其余正常使用。
Docker文件示例:
# syntax = docker/dockerfile:1.3-labs
...
RUN <<EOF cat >> /home/docker/.bashrc
# Virtualenvwrapper configuration.
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/Devel
source /usr/local/bin/virtualenvwrapper.sh
EOF
在 Docker BuildKit 实验室频道 dockerfile/dockerfile:1.3.0-labs
发布之前,不要使用 cat
,请尝试使用 echo
!
把这个 shell cat
例子...
#!/usr/bin/env sh
cat <<EOF > /tmp/example.txt
line 1
line 2
line 3
EOF
... 进入此 Docker 文件 echo
示例!
RUN echo -e '\
line 1\n\
line 2\n\
line 3\
' > /tmp/example.txt
注意 echo
示例中的一对单引号 ('
)。
还要注意 echo
的 -e
标志以支持转义换行符 (\n
)。
注意: 不幸的是,根据您安装的 echo
版本,可能需要也可能不需要 -e
标志。例如,npm:16
图像的 echo
不需要 -e
,实际上会打印 -e
以及单引号行。另一方面,ubuntu:20.04
图像的 echo
确实需要 -e
.
同样的例子可以写在一行中:
RUN echo -e 'line 1\nline 2\nline 3' >> /tmp/example.txt
,但我觉得上面的例子更具可读性。
要回答 OP 的问题,请使用:
# Configure Virtualenvwrapper.
RUN echo -e '\
# Virtualenvwrapper configuration.\n\
export WORKON_HOME=$HOME/.virtualenvs\n\
export PROJECT_HOME=$HOME/Devel\n\
source /usr/local/bin/virtualenvwrapper.sh\
' >> /home/docker/.bashrc
注意: 转义符可以通过escape
directive重新定义。如果您的 Docker 文件具有不同的转义字符集,您需要相应地修改示例。