我一直在寻找答案,但我没有找到它,我需要在我继续我的测试之前弄明白。
我正在通过安装bash创建一个基于Alpine的映像,如下图所示:
FROM alpine:3.12
RUN apk add --no-cache --upgrade bash rsync gzip \
&& rm -rf /var/cache/apk/*
COPY ./docker/backup/hello.sh /hello.sh
RUN mkdir /backup \
&& chmod u+x /hello.sh
WORKDIR /backup
ENTRYPOINT ["sh","/hello.sh"]
CMD ["/bin/bash"]
Hello.sh
#!/bin/sh
echo "=> Hello Word"
echo "$@"
exec "$@"
docker-compose exec myalpine bash
services:
myalpine:
build:
context: ./
dockerfile: ./docker/backup/Dockerfile
args:
- DOCKER_ENV=${DOCKER_ENV}
restart: unless-stopped
tty: true
container_name: ${PROJECT_NAME}-files
volumes:
- appdata:/app
- ./data/app/backup:/backup
mysql:
build:
context: ./
dockerfile: ./docker/mysql/Dockerfile
args:
- MYSQL_VERSION=${MYSQL_VERSION}
- DOCKER_ENV=${DOCKER_ENV}
restart: always
container_name: ${PROJECT_NAME}-mysql
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- dbdata:/var/lib/mysql
networks:
- db
docker-compose exec mysql bash
我可以在不向docker-compose.yml添加tty:true
的情况下访问,所以Alpine的映像中一定有我不理解和希望理解的东西。
我用dockerfile和docker-compose.yaml的精简版本复制了您的示例,然后运行docker-compose up
。首先,我在没有附加TTY
的情况下运行,因此有以下内容:
~$ docker-compose up
...
...
WARNING: Image for service myalpine was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating test-fies ... done
Attaching to test-fies
test-fies | => Hello Word
test-fies | /bin/bash
~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9a72817b0e28 tty_up_myalpine "sh /hello.sh /bin/b…" 5 minutes ago Restarting (0) Less than a second ago myalpine-fies
如您所见,容器一直在重新启动。原因是hello.sh
作为入口点将接收命令/bin/bash
并执行bash。这将尝试创建交互式shell
,但是由于没有TTY
,因此shell的创建失败,容器停止。因为容器标记为restart:除非-stopped
,所以它将处于一个不断的重新启动循环中。
由于容器未运行,您无法执行docker-compose exec myalpine bash
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
745f5139f510 tty_up_myalpine "sh /hello.sh /bin/b…" 10 seconds ago Up 9 seconds myalpine-fies
问题内容: 我正在用查询执行ajax请求,想知道为什么我的响应已经是JS对象。 如果我做一个 ‘obj’为null,但是我可以将’response’用作js对象数组。 这不是真正的问题,但是我想了解这种行为。 谢谢 问题答案: 当您进行AJAX调用并指定dataType JSON时,就会发生这种情况jQuery会在响应中为您调用jQuery.parseJSON。实际上,您可以根据数据类型指定要调用
我上了Java的课程,正在努力自学C和K 在Java中,您可以声明一个类似于公共静态浮点转换(int f)的函数,而不需要原型。这对我来说似乎简单得多。为什么会有差异?
如果我在我的类中创建一个bool,就像一样,它默认为false。 当我在我的方法中创建相同的bool时,我得到一个错误“使用未分配的局部变量检查”。为什么?
/usr/include/c++/7.2.0/bits/stl_function.h:在'constexpr bool std::greater<_tp>::operator()(const_tp&,const_tp&)const[with_tp=MyStruct]': /usr/include/c++/7.2.0/bits/stl_function.h:376:20:错误:与'operator>
我正在阅读本教程,它的底部写道: 由于如果不加选择地使用隐式转换,隐式转换可能会产生陷阱,因此编译器会在编译隐式转换定义时发出警告。要关闭警告,请执行以下任一操作:将 scala.language.implicitConversions 导入到隐式转换定义的作用域中... 如果使用隐式 val 而不是隐式 def,则不会引发警告。为什么? 换句话说,如果我执行以下操作,我不需要导入: 但是,如果我
互联网是超文本标记语言(HTML)页面的集合,它们彼此链接以形成概念性信息网络。随着时间的推移,静态资源数量增加,图像等更丰富的项目开始成为Web结构的一部分。 高级服务器技术允许动态服务器页面 - 其内容基于查询生成的页面。 很快,需要拥有更多动态网页才能获得动态超文本标记语言(DHTML)。一切都归功于JavaScript。在接下来的几年中,我们看到了跨帧通信,试图避免页面重新加载,然后在帧内